BEGIN DIALOG CONVERSATION (Transact-SQL)BEGIN DIALOG CONVERSATION (Transact-SQL)

GILT FÜR: JaSQL Server JaAzure SQL-Datenbank (nur verwaltete Instanz) NeinAzure Synapse Analytics (SQL DW) NeinParallel Data Warehouse APPLIES TO: YesSQL Server YesAzure SQL Database (Managed Instance only) NoAzure Synapse Analytics (SQL DW) NoParallel Data Warehouse

Beginnt einen Dialog zwischen zwei Diensten.Begins a dialog from one service to another service. Ein Dialog ermöglicht eine Konversation zwischen zwei Diensten, bei der jede Nachricht genau einmal übertragen wird, und zwar an der Reihenfolgeposition, an der sie gesendet wird.A dialog is a conversation that provides exactly-once-in-order messaging between two services.

Symbol für Themenlink Transact-SQL-SyntaxkonventionenTopic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

  
BEGIN DIALOG [ CONVERSATION ] @dialog_handle  
   FROM SERVICE initiator_service_name  
   TO SERVICE 'target_service_name'  
       [ , { 'service_broker_guid' | 'CURRENT DATABASE' }]   
   [ ON CONTRACT contract_name ]  
   [ WITH  
   [  { RELATED_CONVERSATION = related_conversation_handle   
      | RELATED_CONVERSATION_GROUP = related_conversation_group_id } ]   
   [ [ , ] LIFETIME = dialog_lifetime ]   
   [ [ , ] ENCRYPTION = { ON | OFF }  ] ]  
[ ; ]  

ArgumenteArguments

@ Dialoghandle@ dialog_handle
Eine Variable, die zum Speichern des systemgenerierten Dialoghandles für den neuen Dialog verwendet wird, der von der BEGIN DIALOG CONVERSATION-Anweisung zurückgegeben wird.Is a variable used to store the system-generated dialog handle for the new dialog that is returned by the BEGIN DIALOG CONVERSATION statement. Die Variable muss vom Typ uniqueidentifier sein.The variable must be of type uniqueidentifier.

FROM SERVICE initiator_service_nameFROM SERVICE initiator_service_name
Gibt den Dienst an, der den Dialog initialisiert.Specifies the service that initiates the dialog. Bei dem angegebenen Namen muss es sich um den Namen eines Diensts in der aktuellen Datenbank handeln.The name specified must be the name of a service in the current database. Die als Initiatordienst angegebene Warteschlange empfängt Nachrichten, die vom Zieldienst zurückgegeben werden, sowie Nachrichten, die von Service Broker für diese Konversation erstellt wurden.The queue specified for the initiator service receives messages returned by the target service and messages created by Service Broker for this conversation.

TO SERVICE ' target_service_name 'TO SERVICE 'target_service_name'
Gibt den Zieldienst an, mit dem der Dialog initialisiert werden soll.Specifies the target service with which to initiate the dialog. Der target_service_name ist vom Typ nvarchar(256) .The target_service_name is of type nvarchar(256). Service BrokerService Broker führt einen bitweisen Vergleich mit der target_service_name-Zeichenfolge aus.uses a byte-by-byte comparison to match the target_service_name string. Das heißt, dass bei dem Vergleich die Groß- und Kleinschreibung beachtet und die aktuelle Sortierung nicht berücksichtigt wird.In other words, the comparison is case-sensitive and does not take into account the current collation.

service_broker_guidservice_broker_guid
Gibt die Datenbank an, auf der sich der Zieldienst befindet.Specifies the database that hosts the target service. Wenn mehrere Datenbanken eine Instanz des Zieldiensts hosten, können Sie mit einer bestimmten Datenbank kommunizieren, indem Sie service_broker_guid angeben.When more than one database hosts an instance of the target service, you can communicate with a specific database by providing a service_broker_guid.

Die service_broker_guid ist vom Typ nvarchar(128) .The service_broker_guid is of type nvarchar(128). Führen Sie die folgende Abfrage in der Datenbank aus, um die service_broker_guid für eine Datenbank zu ermitteln:To find the service_broker_guid for a database, run the following query in the database:

SELECT service_broker_guid  
FROM sys.databases  
WHERE database_id = DB_ID() ;  

Hinweis

Diese Option ist in einer enthaltenen Datenbank nicht verfügbar.This option is not available in a contained database.

' CURRENT DATABASE '' CURRENT DATABASE '
Gibt an, dass die Konversation für die aktuelle Datenbank service_broker_guid verwendet.Specifies that the conversation use the service_broker_guid for the current database.

ON CONTRACT contract_nameON CONTRACT contract_name
Gibt den Vertrag an, dem diese Konversation entspricht.Specifies the contract that this conversation follows. Der Vertrag muss in der aktuellen Datenbank vorhanden sein.The contract must exist in the current database. Wenn der Zieldienst für den angegebenen Vertrag keine neuen Konversationen akzeptiert, gibt Service BrokerService Broker eine Fehlermeldung zur Konversation zurück.If the target service does not accept new conversations on the contract specified, Service BrokerService Broker returns an error message on the conversation. Wird diese Klausel weggelassen, folgt die Konversation dem Vertrag mit dem Namen DEFAULT.When this clause is omitted, the conversation follows the contract named DEFAULT.

RELATED_CONVERSATION = related_conversation_handleRELATED_CONVERSATION =related_conversation_handle
Gibt die vorhandene Konversationsgruppe an, der der neue Dialog hinzugefügt wird.Specifies the existing conversation group that the new dialog is added to. Wenn diese Klausel vorhanden ist, gehört der neue Dialog derselben Konversationsgruppe an, wie der mit related_conversation_handle angegebene Dialog.When this clause is present, the new dialog belongs to the same conversation group as the dialog specified by related_conversation_handle. related_conversation_handle muss implizit in den Typ uniqueidentifier konvertierbar sein.The related_conversation_handlemust be of a type implicitly convertible to type uniqueidentifier. Die Anweisung schlägt fehl, wenn related_conversation_handle nicht auf einen vorhandenen Dialog verweist.The statement fails if the related_conversation_handle does not reference an existing dialog.

RELATED_CONVERSATION_GROUP = related_conversation_group_idRELATED_CONVERSATION_GROUP =related_conversation_group_id
Gibt die vorhandene Konversationsgruppe an, der der neue Dialog hinzugefügt wird.Specifies the existing conversation group that the new dialog is added to. Wenn diese Klausel vorhanden ist, wird der neue Dialog zu der mit related_conversation_group_id angegebenen Konversationsgruppe hinzugefügt.When this clause is present, the new dialog will be added to the conversation group specified by related_conversation_group_id. related_conversation_group_id muss implizit in den Typ uniqueidentifier konvertierbar sein.The related_conversation_group_idmust be of a type implicitly convertible to type uniqueidentifier. Wenn related_conversation_group_id nicht auf eine vorhandene Konversationsgruppe verweist, erstellt der Service Broker eine neue Konversationsgruppe mit der angegebenen related_conversation_group_id und verknüpft den neuen Dialog mit dieser Konversationsgruppe.If related_conversation_group_iddoes not reference an existing conversation group, the service broker creates a new conversation group with the specified related_conversation_group_id and relates the new dialog to that conversation group.

LIFETIME = dialog_lifetimeLIFETIME =dialog_lifetime
Gibt den maximalen Zeitraum an, in dem der Dialog geöffnet bleibt.Specifies the maximum amount of time the dialog will remain open. Damit der Dialog erfolgreich abgeschlossen wird, müssen beide Endpunkte den Dialog explizit beenden, bevor die Lebensdauer abläuft.For the dialog to complete successfully, both endpoints must explicitly end the dialog before the lifetime expires. Der Wert für dialog_lifetime muss in Sekunden angegeben werden.The dialog_lifetime value must be expressed in seconds. „Lifetime“ ist vom Typ int. Wird keine LIFETIME-Klausel angegeben, entspricht die Lebensdauer des Dialogs dem maximalen Wert des Datentyps int.Lifetime is of type int. When no LIFETIME clause is specified, the dialog lifetime is the maximum value of the int data type.

ENCRYPTIONENCRYPTION
Gibt an, ob Nachrichten, die über diesen Dialog versandt und empfangen werden, verschlüsselt werden müssen, wenn sie außerhalb einer MicrosoftMicrosoft SQL ServerSQL Server-Instanz versandt werden.Specifies whether or not messages sent and received on this dialog must be encrypted when they are sent outside of an instance of MicrosoftMicrosoft SQL ServerSQL Server. Ein Dialog, der verschlüsselt werden muss, ist ein sicherer Dialog.A dialog that must be encrypted is a secured dialog. Wenn ENCRYPTION = ON festgelegt wurde und wenn die für die Verschlüsselung erforderlichen Zertifikate nicht konfiguriert sind, gibt Service BrokerService Broker für die Konversation eine Fehlermeldung zurück.When ENCRYPTION = ON and the certificates required to support encryption are not configured, Service BrokerService Broker returns an error message on the conversation. Wenn ENCRYPTION = OFF festgelegt ist, wird die Verschlüsselung nur dann verwendet, wenn eine Remotedienstbindung für target_service_name konfiguriert ist; andernfalls werden Nachrichten unverschlüsselt versandt.If ENCRYPTION = OFF, encryption is used if a remote service binding is configured for the target_service_name; otherwise messages are sent unencrypted. Ist diese Klausel nicht vorhanden, ist die Standardeinstellung ON.If this clause is not present, the default value is ON.

Hinweis

Nachrichten, die mit Diensten in derselben Instanz von SQL ServerSQL Server ausgetauscht werden, sind nie verschlüsselt.Messages exchanged with services in the same instance of SQL ServerSQL Server are never encrypted. Jedoch sind ein Hauptschlüssel für die Datenbank und die Zertifikate für die Verschlüsselung für diejenigen Konversationen mit Verschlüsselung erforderlich, bei denen sich die Dienste für die Konversation auf verschiedenen Datenbanken befinden.However, a database master key and the certificates for encryption are still required for conversations that use encryption if the services for the conversation are in different databases. Damit kann die Konversation auch dann fortgesetzt werden, wenn während der Ausführung der Konversation eine der Datenbanken auf eine andere Instanz verschoben wird.This allows conversations to continue in the event that one of the databases is moved to a different instance while the conversation is in progress.

BemerkungenRemarks

Alle Nachrichten sind Teil einer Konversation.All messages are part of a conversation. Deshalb muss ein initialisierender Dienst eine Konversation mit dem Zieldienst beginnen, bevor eine Nachricht an den Zieldienst gesandt wird.Therefore, an initiating service must begin a conversation with the target service before sending a message to the target service. Die in der BEGIN DIALOG CONVERSATION-Anweisung angegebenen Informationen sind mit der Adresse auf einem Brief vergleichbar; Service BrokerService Broker verwendet diese Informationen, um Nachrichten an den richtigen Dienst zu übermitteln.The information specified in the BEGIN DIALOG CONVERSATION statement is similar to the address on a letter; Service BrokerService Broker uses the information to deliver messages to the correct service. Der Dienst, der in der TO SERVICE-Klausel angegeben wird, ist die Adresse, an die die Nachrichten gesandt werden.The service specified in the TO SERVICE clause is the address that messages are sent to. Der Dienst, der in der FROM SERVICE-Klausel angegeben wird, ist die Rückadresse für Antwortnachrichten.The service specified in the FROM SERVICE clause is the return address used for reply messages.

Das Ziel einer Konversation muss nicht BEGIN DIALOG CONVERSATION aufrufen.The target of a conversation does not need to call BEGIN DIALOG CONVERSATION. Service BrokerService Broker erstellt eine Konversation in der Zieldatenbank, wenn die erste Nachricht in der Konversation vom Initiator eintrifft.creates a conversation in the target database when the first message in the conversation arrives from the initiator.

Durch das Erstellen eines Dialogs wird ein Konversationsendpunkt für den initiierenden Dienst in der Datenbank erstellt, jedoch wird keine Netzwerkverbindung mit der Instanz erstellt, die den Zieldienst hostet.Beginning a dialog creates a conversation endpoint in the database for the initiating service, but does not create a network connection to the instance that hosts the target service. Service BrokerService Broker stellt erst die Kommunikation mit dem Ziel des Dialogs her, wenn die erste Nachricht gesendet wird.does not establish communication with the target of the dialog until the first message is sent.

Wenn die BEGIN DIALOG CONVERSATION-Anweisung keine verknüpfte Konversation oder verknüpfte Konversationsgruppe angibt, legt Service BrokerService Broker für die neue Konversation eine neue Konversationsgruppe an.When the BEGIN DIALOG CONVERSATION statement does not specify a related conversation or a related conversation group, Service BrokerService Broker creates a new conversation group for the new conversation.

Service BrokerService Broker lässt für Konversationen keine beliebigen Gruppierungen zu.does not allow arbitrary groupings of conversations. Für alle Konversationen in einer Konversationsgruppe muss der Dienst in der FROM-Klausel entweder als Initiator oder als Ziel der Konversation angegeben werden.All conversations in a conversation group must have the service specified in the FROM clause as either the initiator or the target of the conversation.

Mit dem BEGIN DIALOG CONVERSATION-Befehl wird die Konversationsgruppe gesperrt, die das zurückgegebene dialog_handle enthält.The BEGIN DIALOG CONVERSATION command locks the conversation group that contains the dialog_handle returned. Wenn der Befehl eine RELATED_CONVERSATION_GROUP-Klausel umfasst, dann ist die Konversationsgruppe für dialog_handle die Konversationsgruppe, die im related_conversation_group_id-Parameter angegeben ist.When the command includes a RELATED_CONVERSATION_GROUP clause, the conversation group for dialog_handle is the conversation group specified in the related_conversation_group_id parameter. Wenn der Befehl eine RELATED_CONVERSATION-Klausel umfasst, dann ist die Konversationsgruppe für dialog_handle die Konversationsgruppe, die mit dem angegebenen related_conversation_handle verknüpft ist.When the command includes a RELATED_CONVERSATION clause, the conversation group for dialog_handle is the conversation group associated with the related_conversation_handle specified.

BEGIN DIALOG CONVERSATION ist in einer benutzerdefinierten Funktion nicht gültig.BEGIN DIALOG CONVERSATION is not valid in a user-defined function.

BerechtigungenPermissions

Um einen Dialog zu beginnen, muss der aktuelle Benutzer eine RECEIVE-Berechtigung für die Warteschlange für den Dienst haben, der in der FROM-Klausel des Befehls angegeben wird. Außerdem muss er über die Berechtigung REFERENCES für den angegebenen Vertrag verfügen.To begin a dialog, the current user must have RECEIVE permission on the queue for the service specified in the FROM clause of the command and REFERENCES permission for the contract specified.

BeispieleExamples

A.A. Starten eines DialogsBeginning a dialog

Im folgenden Beispiel wird eine Dialogkonversation begonnen, und ein Bezeichner für den Dialog wird in @dialog_handle. gespeichert. Der Dienst //Adventure-Works.com/ExpenseClient ist der Initiator für den Dialog, und der Dienst //Adventure-Works.com/Expenses ist das Ziel des Dialogs.The following example begins a dialog conversation and stores an identifier for the dialog in @dialog_handle. The //Adventure-Works.com/ExpenseClient service is the initiator for the dialog, and the //Adventure-Works.com/Expenses service is the target of the dialog. Der Dialog entspricht dem Vertrag //Adventure-Works.com/Expenses/ExpenseSubmission.The dialog follows the contract //Adventure-Works.com/Expenses/ExpenseSubmission.

DECLARE @dialog_handle UNIQUEIDENTIFIER ;  
  
BEGIN DIALOG CONVERSATION @dialog_handle  
   FROM SERVICE [//Adventure-Works.com/ExpenseClient]  
   TO SERVICE '//Adventure-Works.com/Expenses'  
   ON CONTRACT [//Adventure-Works.com/Expenses/ExpenseSubmission] ;  

B.B. Starten eines Dialogs mit einer expliziten LebensdauerBeginning a dialog with an explicit lifetime

Im folgenden Beispiel wird eine Dialogkonversation begonnen, und ein Bezeichner für den Dialog wird in @dialog_handle gespeichert.The following example begins a dialog conversation and stores an identifier for the dialog in @dialog_handle. Der Dienst //Adventure-Works.com/ExpenseClient ist der Initiator für den Dialog, und der Dienst //Adventure-Works.com/Expenses ist das Ziel des Dialogs.The //Adventure-Works.com/ExpenseClient service is the initiator for the dialog, and the //Adventure-Works.com/Expenses service is the target of the dialog. Der Dialog entspricht dem Vertrag //Adventure-Works.com/Expenses/ExpenseSubmission.The dialog follows the contract //Adventure-Works.com/Expenses/ExpenseSubmission. Wenn der Dialog nicht innerhalb von 60 Sekunden mit dem Befehl END CONVERSATION geschlossen wird, beendet Service Broker den Dialog mit einem Fehler.If the dialog has not been closed by the END CONVERSATION command within 60 seconds, the broker ends the dialog with an error.

DECLARE @dialog_handle UNIQUEIDENTIFIER ;  
  
BEGIN DIALOG CONVERSATION @dialog_handle  
   FROM SERVICE [//Adventure-Works.com/ExpenseClient]  
   TO SERVICE '//Adventure-Works.com/Expenses'  
   ON CONTRACT [//Adventure-Works.com/Expenses/ExpenseSubmission]  
   WITH LIFETIME = 60 ;  

C.C. Starten eines Dialogs mit einer bestimmten BrokerinstanzBeginning a dialog with a specific broker instance

Im folgenden Beispiel wird eine Dialogkonversation begonnen, und ein Bezeichner für den Dialog wird in @dialog_handle gespeichert.The following example begins a dialog conversation and stores an identifier for the dialog in @dialog_handle. Der Dienst //Adventure-Works.com/ExpenseClient ist der Initiator für den Dialog, und der Dienst //Adventure-Works.com/Expenses ist das Ziel des Dialogs.The //Adventure-Works.com/ExpenseClient service is the initiator for the dialog, and the //Adventure-Works.com/Expenses service is the target of the dialog. Der Dialog entspricht dem Vertrag //Adventure-Works.com/Expenses/ExpenseSubmission.The dialog follows the contract //Adventure-Works.com/Expenses/ExpenseSubmission. Service Broker leitet Nachrichten für diesen Dialog an den Broker weiter, der über folgenden GUID angegeben wird: a326e034-d4cf-4e8b-8d98-4d7e1926c904.The broker routes messages on this dialog to the broker identified by the GUID a326e034-d4cf-4e8b-8d98-4d7e1926c904.

DECLARE @dialog_handle UNIQUEIDENTIFIER ;  
  
BEGIN DIALOG CONVERSATION @dialog_handle  
   FROM SERVICE [//Adventure-Works.com/ExpenseClient]  
   TO SERVICE '//Adventure-Works.com/Expenses',   
              'a326e034-d4cf-4e8b-8d98-4d7e1926c904'  
   ON CONTRACT [//Adventure-Works.com/Expenses/ExpenseSubmission] ;  

D:D. Starten eines Dialogs und Zuordnen des Dialogs zu einer vorhandenen KonversationsgruppeBeginning a dialog, and relating it to an existing conversation group

Im folgenden Beispiel wird eine Dialogkonversation begonnen, und ein Bezeichner für den Dialog wird in @dialog_handle gespeichert.The following example begins a dialog conversation and stores an identifier for the dialog in @dialog_handle. Der Dienst //Adventure-Works.com/ExpenseClient ist der Initiator für den Dialog, und der Dienst //Adventure-Works.com/Expenses ist das Ziel des Dialogs.The //Adventure-Works.com/ExpenseClient service is the initiator for the dialog, and the //Adventure-Works.com/Expenses service is the target of the dialog. Der Dialog entspricht dem Vertrag //Adventure-Works.com/Expenses/ExpenseSubmission.The dialog follows the contract //Adventure-Works.com/Expenses/ExpenseSubmission. Service Broker verknüpft den Dialog mit der durch @conversation_group_id angegebenen Konversationsgruppe, statt eine neue Konversationsgruppe zu erstellen.The broker associates the dialog with the conversation group identified by @conversation_group_id instead of creating a new conversation group.

DECLARE @dialog_handle UNIQUEIDENTIFIER ;  
DECLARE @conversation_group_id UNIQUEIDENTIFIER ;  
  
SET @conversation_group_id = <retrieve conversation group ID from database>  
  
BEGIN DIALOG CONVERSATION @dialog_handle  
   FROM SERVICE [//Adventure-Works.com/ExpenseClient]  
   TO SERVICE '//Adventure-Works.com/Expenses'  
   ON CONTRACT [//Adventure-Works.com/Expenses/ExpenseSubmission]  
   WITH RELATED_CONVERSATION_GROUP = @conversation_group_id ;  

E.E. Starten eines Dialogs mit einer expliziten Lebensdauer und Zuordnen des Dialogs zu einer vorhandenen KonversationBeginning a dialog with an explicit lifetime, and relating the dialog to an existing conversation

Im folgenden Beispiel wird eine Dialogkonversation begonnen, und ein Bezeichner für den Dialog wird in @dialog_handle gespeichert.The following example begins a dialog conversation and stores an identifier for the dialog in @dialog_handle. Der Dienst //Adventure-Works.com/ExpenseClient ist der Initiator für den Dialog, und der Dienst //Adventure-Works.com/Expenses ist das Ziel des Dialogs.The //Adventure-Works.com/ExpenseClient service is the initiator for the dialog, and the //Adventure-Works.com/Expenses service is the target of the dialog. Der Dialog entspricht dem Vertrag //Adventure-Works.com/Expenses/ExpenseSubmission.The dialog follows the contract //Adventure-Works.com/Expenses/ExpenseSubmission. Der neue Dialog gehört der gleichen Konversationsgruppe an, zu der @existing_conversation_handle gehört.The new dialog belongs to the same conversation group that @existing_conversation_handle belongs to. Wenn der Dialog nicht innerhalb von 600 Sekunden mit dem Befehl END CONVERSATION geschlossen wird, beendet Service BrokerService Broker den Dialog mit einem Fehler.If the dialog has not been closed by the END CONVERSATION command within 600 seconds, Service BrokerService Broker ends the dialog with an error.

DECLARE @dialog_handle UNIQUEIDENTIFIER  
DECLARE @existing_conversation_handle UNIQUEIDENTIFIER  
  
SET @existing_conversation_handle = <retrieve conversation handle from database>  
  
BEGIN DIALOG CONVERSATION @dialog_handle  
   FROM SERVICE [//Adventure-Works.com/ExpenseClient]  
   TO SERVICE '//Adventure-Works.com/Expenses'  
   ON CONTRACT [//Adventure-Works.com/Expenses/ExpenseSubmission]  
   WITH RELATED_CONVERSATION = @existing_conversation_handle  
   LIFETIME = 600 ;  

F.F. Starten eines Dialogs mit optionaler VerschlüsselungBeginning a dialog with optional encryption

Im folgenden Beispiel wird ein Dialog begonnen, und ein Bezeichner für den Dialog wird in @dialog_handle gespeichert.The following example begins a dialog and stores an identifier for the dialog in @dialog_handle. Der Dienst //Adventure-Works.com/ExpenseClient ist der Initiator für den Dialog, und der Dienst //Adventure-Works.com/Expenses ist das Ziel des Dialogs.The //Adventure-Works.com/ExpenseClient service is the initiator for the dialog, and the //Adventure-Works.com/Expenses service is the target of the dialog. Der Dialog entspricht dem Vertrag //Adventure-Works.com/Expenses/ExpenseSubmission.The dialog follows the contract //Adventure-Works.com/Expenses/ExpenseSubmission. Die Konversation in diesem Beispiel lässt es zu, dass die Nachricht unverschlüsselt über das Netzwerk weitergeleitet wird, wenn die Verschlüsselung nicht verfügbar ist.The conversation in this example allows the message to travel over the network without encryption if encryption is not available.

DECLARE @dialog_handle UNIQUEIDENTIFIER  
  
BEGIN DIALOG CONVERSATION @dialog_handle  
   FROM SERVICE [//Adventure-Works.com/ExpenseClient]  
   TO SERVICE '//Adventure-Works.com/Expenses'  
   ON CONTRACT [//Adventure-Works.com/Expenses/ExpenseSubmission]  
   WITH ENCRYPTION = OFF ;  

Weitere InformationenSee Also

BEGIN CONVERSATION TIMER (Transact-SQL) BEGIN CONVERSATION TIMER (Transact-SQL)
END CONVERSATION (Transact-SQL) END CONVERSATION (Transact-SQL)
MOVE CONVERSATION (Transact-SQL) MOVE CONVERSATION (Transact-SQL)
sys.conversation_endpoints (Transact-SQL)sys.conversation_endpoints (Transact-SQL)