END CONVERSATION (Transact-SQL)
Gilt für: SQL Server Azure SQL Managed Instance
Beendet eine bestehende Konversation auf einer Seite.
Transact-SQL-Syntaxkonventionen
Syntax
END CONVERSATION conversation_handle
[ [ WITH ERROR = failure_code DESCRIPTION = 'failure_text' ]
| [ WITH CLEANUP ]
]
[ ; ]
Argumente
conversation_handle
Bezeichnet das Konversationshandle für die zu beendende Konversation.
WITH ERROR =failure_code
Bezeichnet den Fehlercode. failure_code ist vom Typ int. Bei dem Fehlercode handelt es sich um einen benutzerdefinierten Code, der in der Fehlermeldung eingeschlossen ist, die an die andere Seite der Konversation gesendet wird. Der Fehlercode muss größer als 0 sein.
DESCRIPTION =failure_text
Bezeichnet die Fehlermeldung. failure_text ist vom Typ nvarchar(3000). Beim Fehlertext handelt es sich um benutzerdefinierten Text, der in der Fehlermeldung eingeschlossen ist, die an die andere Seite der Konversation gesendet wird.
WITH CLEANUP
Entfernt alle Nachrichten und Katalogsichteinträge für eine Seite einer Konversation, die nicht regulär abgeschlossen werden kann. Die andere Seite der Konversation wird nicht über die Bereinigung informiert. Microsoft SQL Server löscht den Konversationsendpunkt, alle Nachrichten für die Konversation in der Übertragungswarteschlange sowie alle Nachrichten für die Konversation in der Dienstwarteschlange. Mithilfe dieser Option können Administratoren Konversationen entfernen, die nicht regulär abgeschlossen werden können. Wenn beispielsweise der Remotedienst dauerhaft entfernt wurde, kann ein Administrator mithilfe von WITH CLEANUP Konversationen mit diesem Dienst entfernen. Verwenden Sie WITH CLEANUP nicht im Code einer Service Broker-Anwendung. Wenn END CONVERSATION WITH CLEANUP ausgeführt wird, bevor der empfangende Endpunkt den Eingang der Nachricht bestätigt, wird die Nachricht vom sendenden Endpunkt erneut gesendet. Möglicherweise wird dadurch der Dialog erneut ausgeführt.
Bemerkungen
Durch das Beenden einer Konversation wird die Konversationsgruppe gesperrt, zu der conversation_handle gehört. Wenn eine Konversation beendet wird, entfernt Service Broker alle Nachrichten für die Konversation aus der Dienstwarteschlange.
Nach dem Ende einer Konversation kann eine Anwendung keine Nachrichten für diese Konversation mehr senden oder empfangen. Beide Teilnehmer an einer Konversation müssen END CONVERSATION aufrufen, damit die Konversation abgeschlossen wird. Wenn Service Broker keine Nachricht über das Beenden des Dialogs oder eine Fehlermeldung des anderen Teilnehmers an der Konversation erhalten hat, benachrichtigt Service Broker den anderen Teilnehmer, dass die Konversation beendet wurde. Obwohl das Konversationshandle für die Konversation nicht mehr gültig ist, bleibt in diesem Fall der Konversationsendpunkt so lange aktiv, bis die Instanz, die als Host für den Remotedienst dient, die Nachricht anerkennt.
Wenn Service Broker noch keine Nachricht über das Beenden des Dialogs oder eine Fehlermeldung für die Konversation verarbeitet hat, benachrichtigt Service Broker die Remoteseite der Konversation, dass die Konversation beendet wurde. Die von Service Broker an den Remotedienst gesendeten Nachrichten hängen von den angegebenen Optionen ab:
Wenn die Konversation ohne Fehler beendet wird und die Konversation mit dem Remotedienst weiterhin aktiv ist, sendet Service Broker eine Nachricht vom Typ
https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog
an den Remotedienst. Service Broker fügt diese Meldung der Übertragungswarteschlange in der Reihenfolge der Konversation hinzu. Service Broker sendet alle Nachrichten für diese Konversation, die sich derzeit in der Übertragungswarteschlange befinden, bevor diese Nachricht gesendet wird.Wenn die Konversation mit einem Fehler beendet wird und die Konversation mit dem Remotedienst weiterhin aktiv ist, sendet Service Broker eine Nachricht vom Typ
https://schemas.microsoft.com/SQL/ServiceBroker/Error
an den Remotedienst. Service Broker löscht alle anderen Nachrichten für diese Konversation, die sich derzeit in der Übertragungswarteschlange befinden.Die WITH CLEANUP-Klausel ermöglicht einem Datenbankadministrator das Entfernen von Konversationen, die nicht regulär abgeschlossen werden können. Mit dieser Option werden alle Nachrichten und Katalogsichteinträge für die Konversation entfernt. In diesem Fall empfängt die Remoteseite der Konversation keinen Hinweis auf das Ende der Konversation und empfängt möglicherweise Nachrichten nicht, die von einer Anwendung gesendet, jedoch noch nicht über das Netzwerk übermittelt wurden. Sie sollten diese Option nur dann auswählen, wenn die Konversation nicht regulär abgeschlossen werden kann.
Nach dem Ende einer Konversation verursacht eine Transact-SQL-SEND-Anweisung, die das Konversationshandle angibt, einen Transact-SQL-Fehler. Wenn Nachrichten für diese Konversation von der anderen Seite der Konversation eintreffen, werden diese von Service Broker verworfen.
Wenn eine Konversation endet, während noch ungesendete Nachrichten für die Konversation beim Remotedienst vorliegen, löscht der Remotedienst die ungesendeten Nachrichten. Dies wird nicht als Fehler betrachtet, und der Remotedienst erhält keine Benachrichtigung, dass Nachrichten gelöscht wurden.
Fehlercodes in der WITH ERROR-Klausel müssen positive Zahlen sein. Negative Zahlen sind für Fehlermeldungen von Service Broker vorbehalten.
END CONVERSATION ist in einer benutzerdefinierten Funktion ungültig.
Berechtigungen
Zum Beenden einer aktiven Konversation muss der aktuelle Benutzer Besitzer der Konversation, Mitglied der festen Serverrolle sysadmin oder Mitglied der festen Datenbankrolle db_owner sein.
Ein Mitglied der festen Serverrolle sysadmin oder der festen Datenbankrolle db_owner kann mithilfe von WITH CLEANUP die Metadaten einer bereits abgeschlossenen Konversation entfernen.
Beispiele
A. Beenden einer Konversation
Im folgenden Beispiel wird der von @dialog_handle
angegebene Dialog beendet.
END CONVERSATION @dialog_handle ;
B. Beenden einer Konversation mit einem Fehler
Im folgenden Beispiel wird der von @dialog_handle
angegebene Dialog mit einem Fehler beendet, wenn die verarbeitende Anweisung einen Fehler meldet. Dieser Ansatz der Fehlerbehandlung ist stark vereinfachend und möglicherweise nicht für alle Anwendungen geeignet.
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. Bereinigen einer Konversation, die nicht normal abgeschlossen werden kann
Im folgenden Beispiel wird der von @dialog_handle
angegebene Dialog beendet. SQL Server entfernt alle Nachrichten unmittelbar aus der Dienstwarteschlange und der Übertragungswarteschlange ohne den Remotedienst zu benachrichtigen. Da beim Beenden eines Dialogs mit Cleanup der Remotedienst nicht benachrichtigt wird, sollten Sie diese Option nur verwenden, wenn der Remotedienst keine EndDialog- oder Error-Nachricht empfangen kann.
END CONVERSATION @dialog_handle WITH CLEANUP;
Weitere Informationen
BEGIN CONVERSATION TIMER (Transact-SQL)
BEGIN DIALOG CONVERSATION (Transact-SQL)
sys.conversation_endpoints (Transact-SQL)