END CONVERSATION (Transact-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
    移除無法正常完成之交談這一端的所有訊息和目錄檢視項目。 交談的另一端將不會收到此清除的通知。MicrosoftSQL 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 ;