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 ) ]  
[ ; ]  

Аргументы

О РАЗГОВОРЕ 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 передаёт сообщение от сервисов на одном конце одного или нескольких разговоров с сервисным брокером на другой стороне этих разговоров. Затем оператор RECEIVE используется для получения отправленного сообщения из очередей, связанных с целевой службой.

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

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

  • Когда отправленное сообщение — это ответ на ранее полученное сообщение от другого сервиса, используйте дескриптор разговора, возвращаемый RECEIVE оператором, вернувшим исходное сообщение.

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

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

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

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

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

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

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

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

Заявление отдельно блокирует каждый разговор, в котором отправляется сообщение, чтобы гарантировать 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)