SEND (Transact-SQL)SEND (Transact-SQL)

DIESES THEMA GILT FÜR:jaSQL Server (ab 2008)neinAzure SQL-DatenbankneinAzure SQL Data Warehouse neinParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)noAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Sendet eine Nachricht mit einer oder mehreren vorhandenen Konversation.Sends a message, using one or more existing conversations.

Themenlinksymbol Transact-SQL Syntax Conventions (Transact-SQL-Syntaxkonventionen)Topic link icon Transact-SQL Syntax Conventions

SyntaxSyntax


SEND  
   ON CONVERSATION [(]conversation_handle [,.. @conversation_handle_n][)]  
   [ MESSAGE TYPE message_type_name ]  
   [ ( message_body_expression ) ]  
[ ; ]  

ArgumenteArguments

ON CONVERSATION conversation_handle [.. @conversation_handle_n]ON CONVERSATION conversation_handle [.. @conversation_handle_n]
Gibt die Konversationen an, zu der die Nachricht gehört.Specifies the conversations that the message belongs to. conversation_handle muss eine gültige Konversations-ID enthalten.The conversation_handle must contain a valid conversation identifier. Das gleiche Konversationshandle kann jeweils nur einmal verwendet werden.The same conversation handle cannot be used more than once.

MESSAGE TYPE message_type_nameMESSAGE TYPE message_type_name
Gibt den Nachrichtentyp der gesendeten Nachricht an.Specifies the message type of the sent message. Der Nachrichtentyp muss in den von den Konversationen verwendeten Dienstverträgen enthalten sein.This message type must be included in the service contracts used by these conversations. Diese Verträge müssen das Senden des Nachrichtentyps von dieser Seite der Konversation zulassen.These contracts must allow the message type to be sent from this side of the conversation. Die Zieldienste der Konversationen können beispielsweise nur Nachrichten senden, die im Vertrag als SENT BY TARGET oder SENT BY ANY angegeben sind.For example, the target services of the conversations may only send messages specified in the contract as SENT BY TARGET or SENT BY ANY. Wird diese Klausel ausgelassen, ist die Nachricht vom Nachrichtentyp DEFAULT.If this clause is omitted, the message is of the message type DEFAULT.

message_body_expressionmessage_body_expression
Stellt einen Ausdruck bereit, der den Nachrichtentext darstellt.Provides an expression representing the message body. message_body_expression ist optional.The message_body_expression is optional. Wenn message_body_expression jedoch angegeben wird, muss der Ausdruck von einem Typ sein, der in varbinary(max) konvertiert werden kann.However, if the message_body_expression is present the expression must be of a type that can be converted to varbinary(max). Der Ausdruck kann nicht NULL sein.The expression cannot be NULL. Wird diese Klausel ausgelassen, ist der Nachrichtentext leer.If this clause is omitted, the message body is empty.

RemarksRemarks

Wichtig

Wenn es sich bei der SEND-Anweisung nicht um die erste Anweisung in einem Batch oder in einer gespeicherten Prozedur handelt, muss die vorhergehende Anweisung mit einem Semikolon (;) abgeschlossen werden.If the SEND statement is not the first statement in a batch or stored procedure, the preceding statement must be terminated with a semicolon (;).

Mit der SEND-Anweisung wird eine Nachricht vom Dienst an einem Ende von mindestens einer Service BrokerService Broker-Konversation zum Dienst am anderen Ende dieser Konversation übermittelt.The SEND statement transmits a message from the services on one end of one or more Service BrokerService Broker conversations to the services on the other end of these conversations. Mit der RECEIVE-Anweisung wird die gesendete Nachricht dann aus den Warteschlangen abgerufen, die den Zieldiensten zugeordnet sind.The RECEIVE statement is then used to retrieve the sent message from the queues associated with the target services.

Die in der ON CONVERSATION-Klausel angegebenen Konversationshandles stammt aus einer der folgenden Quellen:The conversation handles supplied to the ON CONVERSATION clause comes from one of three sources:

  • Beim Senden einer Nachricht, die keine Antwort auf eine von einem anderen Dienst empfangene Nachricht darstellt, verwenden Sie das Konversationshandle, das von der BEGIN DIALOG-Anweisung zurückgegeben wurde, mit der die Konversation erstellt wurde.When sending a message that is not in response to a message received from another service, use the conversation handle returned from the BEGIN DIALOG statement that created the conversation.

  • Beim Senden einer Nachricht, die eine Antwort auf eine zuvor von einem anderen Dienst empfangene Nachricht darstellt, verwenden Sie das Konversationshandle, das von der RECEIVE-Anweisung zurückgegeben wurde, mit der die ursprüngliche Nachricht zurückgegeben wurde.When sending a message that is a response to a message previously received from another service, use the conversation handle returned by the RECEIVE statement that returned the original message.

    In vielen Fällen liegt der Code, der die SEND-Anweisung enthält, getrennt von dem Code vor, der die BEGIN DIALOG-Anweisung bzw. die RECEIVE–Anweisung enthält, welche das Konversationshandle liefert.In many cases the code that contains the SEND statement is separate from the code that contains either the BEGIN DIALOG or RECEIVE statements supplying conversation handle. In diesen Fällen muss das Konversationshandle als Datenelement der Statusinformationen an den Code übergeben werden, der die SEND-Anweisung enthält.In these cases, the conversation handle must be one of the data items in the state information passed to the code that contains the SEND statement.

    Nachrichten, die an Dienste in anderen Instanzen von SQL Server-DatenbankmodulSQL Server Database Engine gesendet werden, werden in einer Übertragungswarteschlange in der aktuellen Datenbank gespeichert, bis sie an die Dienstwarteschlangen in den Remoteinstanzen übertragen werden können.Messages that are sent to services in other instances of the SQL Server-DatenbankmodulSQL Server Database Engine are stored in a transmission queue in the current database until they can be transmitted to the service queues in the remote instances. Nachrichten, die an Dienste in derselben Instanz von DatenbankmodulDatabase Engine gesendet werden, werden direkt in den Warteschlangen abgelegt, die den betreffenden Diensten zugeordnet sind.Messages sent to services in the same instance of the DatenbankmodulDatabase Engine are put directly into the queues associated with these services. Wenn eine Bedingung verhindert, dass eine lokale Nachricht direkt in die Warteschlange des Zieldiensts eingefügt wird, kann sie solange in der Übertragungswarteschlange gespeichert werden, bis die Bedingung beseitigt wurde.If a condition prevents a local message from being put directly in the target service queue, it can be stored in the transmission queue until the condition is resolved. Dies kann beispielsweise auftreten, wenn bestimmte Typen von Fehlern vorliegen oder wenn die Zieldienstwarteschlange inaktiv ist.Examples of when this occurs include some types of errors or the target service queue being inactive. Sie können in der sys.transmission_queue-Systemsicht die in der Übertragungswarteschlange vorhandenen Nachrichten anzeigen.You can use the sys.transmission_queue system view to see the messages in the transmission queue.

    SEND ist eine unteilbare Anweisung. Dies bedeutet, dass bei einem Fehler einer SEND-Anweisung zum Senden einer Nachricht an mehrere Konversationen, weil beispielsweise eine Konversation einen Fehlerzustand aufweist, keine Meldungen in der Übertragungswarteschlange gespeichert oder in den Zieldienstwarteschlangen abgelegt werden.SEND is an atomic statement, that is, if a SEND statement sending a message on multiple conversations fails, e.g. because a conversation is in an errored state, no messages will be stored in the transmission queue or put in any target service queue.

    Mit Service Broker wird das Speichern und Übertragen von Nachrichten an mehrere Konversationen in der gleichen SEND-Anweisung optimiert.Service Broker optimizes the storage and transmission of messages that are sent on multiple conversations in the same SEND statement.

    Nachrichten in den Übertragungswarteschlangen für eine Instanz werden anhand folgender Kriterien der Reihe nach übertragen:Messages in the transmission queues for an instance are transmitted in sequence based on:

  • Prioritätsstufe ihres zugeordneten KonversationsendpunktsThe priority level of their associated conversation endpoint.

  • Innerhalb der Prioritätsstufe die Sendereihenfolge in der KonversationWithin priority level, their send sequence in the conversation.

    Prioritätsstufen, die in Konversationsprioritäten angegeben werden, gelten nur für Nachrichten in der Übertragungswarteschlange, wenn die HONOR_BROKER_PRIORITY-Datenbankoption auf ON festgelegt wird.Priority levels specified in conversation priorities are only applied to messages in the transmission queue if the HONOR_BROKER_PRIORITY database option is set to ON. Wenn HONOR_BROKER_PRIORITY auf OFF festgelegt wird, wird allen Nachrichten in der Übertragungswarteschlange für diese Datenbank die Standardprioritätsstufe 5 zugewiesen.If HONOR_BROKER_PRIORITY is set to OFF, all messages put in the transmission queue for that database are assigned the default priority level of 5. Die Prioritätsstufe hat für diejenigen SEND-Anweisungen keine Bedeutung, mit denen Nachrichten direkt in eine Dienstwarteschlange in derselben Instanz von DatenbankmodulDatabase Engine eingefügt werden.Priority levels are not applied to a SEND where the messages are put directly into a service queue in the same instance of the DatenbankmodulDatabase Engine.

    Die einzelnen Konversationen, an die eine Nachricht gesendet werden soll, werden von der SEND-Anweisung separat gesperrt, damit die Nachrichten ordnungsgemäß zugestellt werden können.The SEND statement separately locks each conversation on which a message is sent to ensure per-conversation ordered delivery.

    SEND ist in einer benutzerdefinierten Funktion ungültig.SEND is not valid in a user-defined function.

BerechtigungenPermissions

Um eine Nachricht zu senden, muss der aktuelle Benutzer über die RECEIVE-Berechtigung für die Warteschlange aller Dienste verfügen, mit denen die Nachricht gesendet wird.To send a message, the current user must have RECEIVE permission on the queue of every service that sends the message.

BeispieleExamples

Im folgenden Beispiel wird ein Dialog gestartet und eine XML-Nachricht im Dialog gesendet.The following example starts a dialog and sends an XML message on the dialog. Zum Senden der Nachricht wird das XML-Objekt in varbinary(max) konvertiert.To send the message, the example converts the xml object to varbinary(max).

DECLARE @dialog_handle UNIQUEIDENTIFIER,  
        @ExpenseReport XML ;  

SET @ExpenseReport = < construct message as appropriate for the application > ;  

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

SEND ON CONVERSATION @dialog_handle  
    MESSAGE TYPE [//Adventure-Works.com/Expenses/SubmitExpense]  
    (@ExpenseReport) ;  

Im folgenden Beispiel werden drei Dialoge gestartet, und es wird jeweils eine XML-Nachricht gesendet.The following example starts three dialogs and sends an XML message on each of them.

DECLARE @dialog_handle1 UNIQUEIDENTIFIER,  
        @dialog_handle2 UNIQUEIDENTIFIER,  
        @dialog_handle3 UNIQUEIDENTIFIER,  
        @OrderMsg XML ;  

SET @OrderMsg = < construct message as appropriate for the application > ;  

BEGIN DIALOG @dialog_handle1  
FROM SERVICE [//InitiatorDB/InitiatorService]  
TO SERVICE '//TargetDB1/TargetService’  
ON CONTRACT [//AllDBs/OrderProcessing] ;  

BEGIN DIALOG @dialog_handle2  
FROM SERVICE [//InitiatorDB/InitiatorService]  
TO SERVICE '//TargetDB2/TargetService’  
ON CONTRACT [//AllDBs/OrderProcessing] ;  

BEGIN DIALOG @dialog_handle3  
FROM SERVICE [//InitiatorDB/InitiatorService]  
TO SERVICE '//TargetDB3/TargetService’  
ON CONTRACT [//AllDBs/OrderProcessing] ;  

SEND ON CONVERSATION (@dialog_handle1, @dialog_handle2, @dialog_handle3)  
    MESSAGE TYPE [//AllDBs/OrderMsg]  
    (@OrderMsg) ;  

Weitere Informationen finden Sie unterSee Also

BEGIN DIALOG CONVERSATION (Transact-SQL) BEGIN DIALOG CONVERSATION (Transact-SQL)
END CONVERSATION (Transact-SQL) END CONVERSATION (Transact-SQL)
RECEIVE (Transact-SQL) RECEIVE (Transact-SQL)
sys.transmission_queue (Transact-SQL)sys.transmission_queue (Transact-SQL)