END CONVERSATION (Transact-SQL)

更新日期: 2007 年 9 月 15 日

结束现有会话中的某一方。

语法

END CONVERSATION conversation_handle
   [   [ WITH ERROR = failure_code DESCRIPTION = 'failure_text' ]
     | [ WITH CLEANUP ]
    ]
[ ; ]

参数

  • conversation_handle
    要结束的会话的会话句柄。
  • WITH ERROR = failure_code
    错误代码。 failure_code 的类型为 int。 失败代码是用户定义代码,包含在发送给会话另一方的错误消息中。 失败代码必须大于 0。
  • DESCRIPTION = failure_text
    错误消息。 failure_text 的类型为 nvarchar(3000)。 失败文本是用户定义文本,包含在发送给会话另一方的错误消息中。
  • WITH CLEANUP
    删除不能正常完成会话的某一方的所有消息和目录视图项。 不向此会话的另一方通知此清除情况。Microsoft SQL Server 将删除会话端点、传输队列中会话的所有消息以及服务队列中会话的所有消息。 管理员可以使用此选项删除不能正常完成的会话。 例如,如果已永久性删除远程服务,则管理员可以使用 WITH CLEANUP 删除指向该服务的会话。 不要在 Service Broker 应用程序的代码中使用 WITH CLEANUP。 如果接收端点确认收到消息前运行了 END CONVERSATION WITH CLEANUP,则发送端点将再次发送该消息。 这可能会重新运行此对话。

备注

结束会话将锁定所提供的 conversation_handle 所属的会话组。 会话结束时,Service Broker 将从服务队列中删除所有会话消息。

会话结束后,应用程序不能再发送或接收有关该会话的消息。 会话中的参与双方必须调用 END CONVERSATION 才能完成该会话。 如果 Service Broker 未从会话的另一个参与者那里收到结束对话的消息或错误消息,Service Broker 会通知会话的另一个参与者会话已结束。 在这种情况下,尽管会话的会话句柄已经无效,但会话的端点仍保持活动状态,直到承载远程服务的实例确认该消息。

如果 Service Broker 尚未处理会话的结束对话消息或错误消息,则 Service Broker 会通知远程会话方结束会话。 Service Broker 发送给远程服务的消息取决于指定的选项:

  • 如果会话在无选项的情况下结束并且指向远程服务的会话仍处于活动状态,则 Service Broker 将向该远程服务发送一条 https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog 类型的消息。Service Broker 将此消息按会话顺序添加到传输队列中。Service Broker 在发送此消息前将发送当前处于传输队列中该会话的所有消息。
  • 如果会话在出现错误的情况下结束并且指向远程服务的会话仍处于活动状态,则 Service Broker 将向该远程服务发送一条 https://schemas.microsoft.com/SQL/ServiceBroker/Error 类型的消息。Service Broker 会删除该会话当前在传输队列中的所有其他消息。
  • 使用 WITH CLEANUP 子句,数据库管理员可以删除无法正常完成的会话。 此选项会删除会话中的所有消息和目录视图条目。 请注意,在这种情况下,远程会话方不会收到会话已结束的指示,而且也可能收不到应用程序已发送但尚未通过网络传输的消息。 除非会话不能正常完成,否则请避免使用此选项。

会话结束后,指定会话句柄的 Transact-SQL SEND 语句将导致一个 Transact-SQL 错误。 如果会话的消息来自会话的另一方,则 Service Broker 将放弃这些消息。

如果会话已结束,而远程服务仍未发送会话消息,则远程服务将删除这些未发送的消息。 这不会被视为一个错误,而且远程服务不会收到消息已被删除的通知。

在 WITH ERROR 子句中指定的失败代码必须是正数。 负数被保留用于 Service Broker 错误消息。 有关 Service Broker 错误消息的详细信息,请参阅 Broker 消息

END CONVERSATION 在用户定义函数中无效。

权限

若要结束活动会话,当前用户必须为会话的所有者、sysadmin 固定服务器角色的成员或 db_owner 固定数据库角色的成员。

sysadmin 固定服务器角色的成员或 db_owner 固定数据库角色的成员可以使用 WITH CLEANUP 删除已完成会话的元数据。

示例

A. 结束会话

以下是结束由 @dialog_handle 指定的对话的示例。

END CONVERSATION @dialog_handle ;

B. 结束发生错误的会话

以下是在处理语句报告错误时,结束由 @dialog_handle 指定的发生错误的对话的示例。 请注意,这是一个简单的错误处理方法,可能不适用于某些应用程序。

DECLARE @dialog_handle UNIQUEIDENTIFIER,
        @ErrorSave INT,
        @ErrorDesc NVARCHAR(100) ;
BEGIN TRANSACTION ;

<receive and process message>

SET @ErrorSave = @@ERROR ;

IF (@ErrorSave <> 0)
  BEGIN
      ROLLBACK TRANSACTION ;
      SET @ErrorDesc = N'An error has occurred.' ;
      END CONVERSATION @dialog_handle 
      WITH ERROR = @ErrorSave DESCRIPTION = @ErrorDesc ;
  END
ELSE

COMMIT TRANSACTION ;

C. 清除无法正常完成的会话

此示例结束了 @dialog_handle 指定的对话。SQL Server 将立即删除服务队列和传输队列中的所有消息,并且不通知远程服务。 因为使用清除方法结束对话时不会通知远程服务,因此仅当远程服务无法接收到 EndDialogError 消息时,才应用此方法。

END CONVERSATION @dialog_handle WITH CLEANUP ;

请参阅

参考

BEGIN CONVERSATION TIMER (Transact-SQL)
BEGIN DIALOG CONVERSATION (Transact-SQL)
sys.conversation_endpoints (Transact-SQL)

其他资源

Broker 消息
对话会话
Service Broker 教程

帮助和信息

获取 SQL Server 2005 帮助

更改历史记录

发布日期 历史记录

2007 年 9 月 15 日

更改的内容:
  • 阐明了 WITHOUT CLEANUP 的用法。