Syntax

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

若要檢視 SQL Server 2014 與更早版本的 Transact-SQL 語法,請參閱舊版文件

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

  •