Freigeben über


END CONVERSATION (Transact-SQL)

Beendet eine bestehende Konversation auf einer Seite.

Themenlink (Symbol)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 ein Wert vom Datentyp int. Beim 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 ein Wert vom Datentyp 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 das Cleanup informiert. Microsoft SQL Server löscht den Konversationsendpunkt, alle Nachrichten für die Konversation in der Übermittlungswarteschlange 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.

Hinweise

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 endet und die Konversation mit dem Remotedienst noch aktiviert ist, sendet Service Broker eine Nachricht vom Typ https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog an den Remotedienst. Service Broker fügt diese Nachricht der Übermittlungswarteschlange in der Reihenfolge der Konversationen hinzu. Vor dem Senden dieser Nachricht sendet Service Broker alle Nachrichten für diese Konversation, die sich derzeit in der Übermittlungswarteschlange befinden.

  • Wenn die Konversation mit einem Fehler endet und die Konversation mit dem Remotedienst noch aktiviert 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 Übermittlungswarteschlange 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. Weitere Informationen zu Fehlermeldungen von Service Broker finden Sie unter Brokersystemmeldungen.

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. Cleanup einer Konversation, die nicht regulär abgeschlossen werden kann

Im folgenden Beispiel wird der von @dialog_handle angegebene Dialog beendet. SQL Server entfernt sofort alle Nachrichten aus der Dienstwarteschlange und der Übermittlungswarteschlange, 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 ;