Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: 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)