Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Асинхронное выполнение процедур в T-SQL  [new]
Slider_spb
Member

Откуда:
Сообщений: 800
Возможно ли асинхронное выполнение процедур в T-SQL (SQL Server 2005)?
Т.е. чтобы из кода T-SQL вызвать процедуру и не дожидаться её окончания?
16 ноя 09, 15:01    [7934423]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное выполнение процедур в T-SQL  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
service broker
--------------------------------------------------------------
Дьявол кроется в деталях.
16 ноя 09, 15:02    [7934434]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное выполнение процедур в T-SQL  [new]
Slider_spb
Member

Откуда:
Сообщений: 800
К нему можно обратиться из T-SQL? Уже несколько часов копаюсь в MSDN читая описание Service Broker, но так ни одно примера этого пока не нашел.
16 ноя 09, 15:11    [7934507]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное выполнение процедур в T-SQL  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Это какой-то поеределенный список процедур? Не хотите попробовать задействотать jobs?
16 ноя 09, 15:15    [7934534]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное выполнение процедур в T-SQL  [new]
Slider_spb
Member

Откуда:
Сообщений: 800
Почитал-почитал и решил, что действительно проще перенести эту обработку в Job...
16 ноя 09, 16:00    [7934892]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное выполнение процедур в T-SQL  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
Slider_spb
К нему можно обратиться из T-SQL? Уже несколько часов копаюсь в MSDN читая описание Service Broker, но так ни одно примера этого пока не нашел.

Странно, что вы не нашли! Примеров очень много!
Можно так:
Включаете поддержку SB в вашей базе данных MyDataBase:
ALTER DATABASE MyDataBase SET ENABLE_BROKER
Создаем главный ключ базы данных
USE MyDataBase
GO
IF NOT EXISTS (SELECT * FROM sys.symmetric_keys WHERE name = '##MS_DatabaseMasterKey##')
   CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'сложный пароль';
GO
Создаем объекты SB в базе данных MyDataBase:
USE MayDataBase
-- Тип собщения
CREATE MESSAGE TYPE  [MyTypeMessage]
VALIDATION = WELL_FORMED_XML
GO
-- Контракт
CREATE CONTRACT [MyContract]
(
	[MyTypeMessage]
	SENT BY INITIATOR
)
GO
-- Очередь 1
CREATE QUEUE dbo.MyQUEUE1
WITH STATUS = ON
-- Очередь 2
CREATE QUEUE dbo.MyQUEUE2
WITH STATUS = OFF
GO
-- Сервисы для обмена
CREATE SERVICE [Service1]
ON QUEUE dbo.MyQUEUE1

CREATE SERVICE [Service2]
ON QUEUE dbo.MyQUEUE2
( [MyContract] )

GO
-- Хранимая процедура, которая будет вызываться при поступлении сообщения в очередь
-- dbo.MyQUEUE2
CREATE PROCEDURE dbo.ProcForMyQUEUE2
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @conversation UNIQUEIDENTIFIER
    DECLARE @msg NVARCHAR(MAX)
    DECLARE @msgType NVARCHAR(256)

    ;RECEIVE TOP(1) 
	@conversation = conversation_handle,
	@msgType = message_type_name, 
	@msg = message_body
    FROM MyDataBase.dbo.MyQUEUE2
    IF (@@ROWCOUNT = 0)
      RETURN
    IF (@msgType = 'MyTypeMessage')
    BEGIN
			-- Извлекаем данные из XML документа @msg, напрмиер, с помощью OPENXML
-- Обработка извлеченных данных
...
...
    END
-- Завершаем диалог, хотя правильно было бы еще проверить тип сообщения на 'http://schemas.microsoft.com/SQL/ServiceBroker/Error' и на 'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog'
    END CONVERSATION @conversation 
END;
GO
Включаем обработку очереди MyQUEUE2 с помощью хранимой процедуры ProcForMyQUEUE2
ALTER QUEUE dbo.MyQUEUE2
WITH STATUS = ON,
     ACTIVATION ( 
		STATUS = ON,
		PROCEDURE_NAME = MyDataBase.dbo.ProcForMyQUEUE2, 	
		MAX_QUEUE_READERS = 5,
		EXECUTE AS SELF)
Отправка сообщения, которое заставит запуститься хранимую процедуру MyDataBase.dbo.ProcForMyQUEUE2

DECLARE @message xml
SET @message = NCHAR(0xFEFF)  + 'Текст сообщения в формате XML. Может включать чего вам угодно. Например, параметры хранимой процедуры, которая может вызываться из процедуры dbo.ProcForMyQUEUE2'
DECLARE @dialogHandle UNIQUEIDENTIFIER
BEGIN DIALOG @dialogHandle
FROM SERVICE [Service1]
TO SERVICE 'Service2'
ON CONTRACT [MyContract];
SEND ON CONVERSATION @dialogHandle
MESSAGE TYPE [MyTypeMessage] (@message)
END CONVERSATION @dialogHandle
С уважением, Алексей
17 ноя 09, 10:30    [7937639]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное выполнение процедур в T-SQL  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 887
Дедушка
service broker
--------------------------------------------------------------
Дьявол кроется в деталях.

Оно самое , для этого он и есть.
17 ноя 09, 10:34    [7937662]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить