SEND (Transact-SQL)

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

Применимо для следующих объектов: SQL Server (начиная с SQL Server 2008 до текущей версии).

Значок ссылки на раздел Cинтаксические обозначения в 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 TYPEmessage_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 Database Engine, хранятся в очереди передачи текущей базы данных, пока они не будут переданы в очереди обслуживания удаленных экземпляров. Сообщения, отправленные службам в рамках одного экземпляра компонента Компонент Database Engine, помещаются непосредственно в связанные с этими службами очереди. Если поместить локальное сообщение непосредственно в очередь целевой службы невозможно, оно будет сохранено в очереди передачи до появления такой возможности. Это может происходить, например, при некоторых ошибках или в случае, если очередь целевой службы неактивна. Просмотреть сообщения в очереди передачи можно с помощью системного представления sys.transmission_queue.

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

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

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

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

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

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

Инструкция 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)