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 的使用方式。