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


SEND (Transact-SQL)

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

Значок ссылки на разделСоглашение о синтаксисе в Transact-SQL

Синтаксис

SEND
   ON CONVERSATION conversation_handle
   [ MESSAGE TYPE message_type_name ]
   [ ( message_body_expression ) ]
[ ; ]

Аргументы

  • ON CONVERSATION conversation_handle
    Указывает диалог, к которому принадлежит сообщение. Аргумент 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.

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

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

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

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

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