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 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 系统视图查看传输队列中的消息。

实例的传输队列中的消息按照特定顺序传输,此顺序取决于:

  • 与其关联的会话端点的优先级别。

  • 在优先级别内,依照它们在会话中的发送顺序。

如果 HONOR_BROKER_PRIORITY 数据库选项设置为 ON,则会话优先级中指定的优先级别仅应用于传输队列中的消息。如果 HONOR_BROKER_PRIORITY 设置为 OFF,则会为放入该数据库的传输队列中的所有消息都分配默认优先级别 5。优先级别不应用于将消息直接放入同一数据库引擎实例中的服务队列的 SEND。

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