END CONVERSATION (Transact-SQL)

适用于: SQL Server Azure SQL 托管实例

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

Transact-SQL 语法约定

语法

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 错误消息。

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)