END CONVERSATION (Transact-SQL)

適用於:SQL ServerAzure SQL 受控執行個體

結束現有交談的一端。

Transact-SQL 語法慣例

Syntax

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

注意

若要檢視 SQL Server 2014 (12.x) 和舊版的 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;
    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)