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會立即從服務佇列和傳輸佇列中移除所有訊息,而不會通知遠端服務。 由於在結束對話時進行清除,並不會通知遠端服務,因此,您只應在遠端服務無法接收 EndDialog 或 Error 訊息時,才使用這個方式。
END CONVERSATION @dialog_handle WITH CLEANUP ;
BEGIN CONVERSATION TIMER (Transact-SQL)
BEGIN DIALOG CONVERSATION (Transact-SQL)
sys.conversation_endpoints (Transact-SQL)