Поделиться через


SEND (Transact-SQL)

Область применения: SQL Server Управляемый экземпляр SQL Azure

Отправляет сообщение с помощью одного или нескольких существующих диалогов.

Соглашения о синтаксисе Transact-SQL

Синтаксис

  
SEND  
   ON CONVERSATION [(]conversation_handle [,.. @conversation_handle_n][)]  
   [ MESSAGE TYPE message_type_name ]  
   [ ( message_body_expression ) ]  
[ ; ]  

Аргументы

ON CONVERSATION conversation_handle [.. @conversation_handle_n]
Указывает диалоги, к которым принадлежит сообщение. Аргумент conversation_handle должен содержать правильный идентификатор диалога. Один и тот же дескриптор диалога можно использовать только один раз.

MESSAGE TYPE message_type_name
Указывает тип отправляемого сообщения. Этот тип сообщений должен входить в контракты служб, используемых этими диалогами. Эти контракты должны позволять отправить сообщение данного типа с этой стороны диалога. Например, целевые службы диалогов могут отправлять только сообщения, отмеченные в контракте как SENT BY TARGET или SENT BY ANY. Если это предложение пропущено, то сообщение принадлежит к типу сообщений DEFAULT.

message_body_expression
Содержит выражение, представляющее тело сообщения. Выражение message_body_expression является необязательным. Однако если аргумент message_body_expression указан, то выражение должно иметь тип, преобразуемый в тип varbinary(max). Выражение не может иметь значение NULL. Если это предложение не указано, то тело сообщения пустое.

Замечания

Внимание

Если инструкция SEND не является первой в пакете или хранимой процедуре, предшествующая ей инструкция должна заканчиваться точкой с запятой (;).

Инструкция SEND передает сообщение из служб в одном конце одного или нескольких бесед Service Broker в службы в другом конце этих бесед. Инструкция RECEIVE используется для получения отправленного сообщения из очередей, связанных с целевыми службами.

Указываемые в предложении ON CONVERSATION дескрипторы диалогов берутся из одного из трех источников.

  • Если отправленное сообщение не является ответом на полученное от другой службы сообщение, используйте дескриптор диалога, возвращаемый инструкцией BEGIN DIALOG, с помощью которой был создан диалог.

  • Если отправленное сообщение является ответом на полученное от другой службы сообщение, используйте дескриптор диалога, возвращенный инструкцией RECEIVE, которая вернула исходное сообщение.

  • Иногда код, содержащий инструкцию SEND, отделен от кода, содержащего инструкции BEGIN DIALOG или RECEIVE, которые предоставляют дескриптор диалога. В таких случаях дескриптор диалога должен быть одним из элементов данных в сведениях о состоянии, которые передаются в код, содержащий инструкцию SEND.

Сообщения, отправляемые службам в других экземплярах SQL Server ядро СУБД, хранятся в очереди передачи в текущей базе данных, пока они не смогут передаваться в очереди служб в удаленных экземплярах. Сообщения, отправленные службам в том же экземпляре ядро СУБД, помещаются непосредственно в очереди, связанные с этими службами. Если условие препятствует помещению локального сообщения непосредственно в очередь целевой службы, оно будет сохранено в очереди передачи до появления такой возможности. Это может происходить, например, при некоторых ошибках или в случае, если очередь целевой службы неактивна. Просмотреть сообщения в очереди передачи можно с помощью системного представления sys.transmission_queue.

SEND — это атомарная инструкция. Если с помощью инструкции не удается отправить сообщение в несколько диалогов (например, из-за того, что в одном диалоге произошла ошибка), сообщения не сохраняются в очереди передачи и не помещаются в очередь целевой службы.

Компонент Service Broker оптимизирует хранение и передачу сообщений, отправляемых нескольким диалогам в одной инструкции SEND.

Передача сообщений, находящихся в очередях передачи экземпляра, выполняется в последовательности, которая определяется:

  • уровнем приоритета связанной с ними конечной точки диалога;

  • последовательности отправки в диалоге при одинаковом приоритете.

Уровни приоритета, указанные в приоритетах диалога, применяются к сообщениям в очереди передачи, только если параметр базы данных HONOR_BROKER_PRIORITY имеет значение ON. Если параметр HONOR_BROKER_PRIORITY имеет значение OFF, все сообщения, помещаемые в очередь передачи для этой базы данных, получают приоритет по умолчанию, равный 5. Уровни приоритета не применяются к отправке, где сообщения передаются непосредственно в очередь служб в том же экземпляре ядро СУБД.

Инструкция SEND по отдельности блокирует каждый диалог, в который отправляется сообщение, чтобы обеспечить упорядоченную доставку для каждого диалога.

Инструкция SEND недопустима в определяемых пользователем функциях.

Разрешения

Для отправки сообщения у текущего пользователя должно быть разрешение RECEIVE для очереди в каждой из служб, которые отправляют сообщение.

Примеры

В этом примере инициируется диалог и отправляется XML-сообщение. Чтобы отправить сообщение, в примере выполняется преобразование XML-объекта в тип varbinary(max).

DECLARE @dialog_handle UNIQUEIDENTIFIER,
    @ExpenseReport XML;

SET @ExpenseReport = <construct message as appropriate for the application>;

BEGIN DIALOG @dialog_handle
    FROM SERVICE [//Adventure-Works.com/Expenses/ExpenseClient]
    TO SERVICE '//Adventure-Works.com/Expenses'
    ON CONTRACT [//Adventure-Works.com/Expenses/ExpenseProcessing];

SEND ON CONVERSATION @dialog_handle
    MESSAGE TYPE [//Adventure-Works.com/Expenses/SubmitExpense](@ExpenseReport);

В этом примере инициируется три диалога и в каждый из них отправляется XML-сообщение.

DECLARE
    @dialog_handle1 UNIQUEIDENTIFIER,
    @dialog_handle2 UNIQUEIDENTIFIER,
    @dialog_handle3 UNIQUEIDENTIFIER,
    @OrderMsg XML;

SET @OrderMsg = '<construct message as appropriate for the application>';

BEGIN DIALOG @dialog_handle1
    FROM SERVICE [//InitiatorDB/InitiatorService]
    TO SERVICE '//TargetDB1/TargetService'
    ON CONTRACT [//AllDBs/OrderProcessing];

BEGIN DIALOG @dialog_handle2
    FROM SERVICE [//InitiatorDB/InitiatorService]
    TO SERVICE '//TargetDB2/TargetService'
    ON CONTRACT [//AllDBs/OrderProcessing];

BEGIN DIALOG @dialog_handle3
    FROM SERVICE [//InitiatorDB/InitiatorService]
    TO SERVICE '//TargetDB3/TargetService'
    ON CONTRACT [//AllDBs/OrderProcessing];

SEND ON CONVERSATION (
    @dialog_handle1,
    @dialog_handle2,
    @dialog_handle3
)
    MESSAGE TYPE [//AllDBs/OrderMsg](@OrderMsg); 

См. также

BEGIN DIALOG CONVERSATION (Transact-SQL)
END CONVERSATION (Transact-SQL)
RECEIVE (Transact-SQL)
sys.transmission_queue (Transact-SQL)