SEND (Transact-SQL)

Sendet eine Nachricht mithilfe einer vorhandenen Konversation.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

SEND
   ON CONVERSATION conversation_handle
   [ MESSAGE TYPE message_type_name ]
   [ ( message_body_expression ) ]
[ ; ]

Argumente

  • ON CONVERSATION conversation_handle
    Gibt die Konversation an, zu der die Nachricht gehört. conversation_handle muss eine gültige Konversations-ID enthalten.

  • MESSAGE TYPE message_type_name
    Gibt den Nachrichtentyp der gesendeten Nachricht an. Der Nachrichtentyp muss in dem von der Konversation verwendeten Dienstvertrag enthalten sein. Der Vertrag muss das Senden des Nachrichtentyps von dieser Seite der Konversation zulassen. Das Ziel der Konversation kann z. B. nur Nachrichten senden, die im Vertrag als SENT BY TARGET oder SENT BY ANY angegeben sind. Wird diese Klausel ausgelassen, ist die Nachricht vom Nachrichtentyp DEFAULT.

  • message_body_expression
    Stellt einen Ausdruck bereit, der den Nachrichtentext darstellt. message_body_expression ist optional. Wenn message_body_expression jedoch angegeben wird, muss der Ausdruck von einem Typ sein, der in varbinary(max) konvertiert werden kann. Der Ausdruck kann nicht NULL sein. Wird diese Klausel ausgelassen, ist der Nachrichtentext leer.

Hinweise

Wichtiger HinweisWichtig

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.

Mit der SEND-Anweisung wird eine Nachricht von Dienst an einem Ende einer Service Broker-Konversation zum Dienst am anderen Ende der Konversation übermittelt. Mit der RECEIVE-Anweisung wird die gesendete Nachricht dann aus der Warteschlange abgerufen, die dem Zieldienst zugeordnet ist.

Das in der ON CONVERSATION-Klausel angegebene Konversationshandle stammt aus einer der folgenden beiden Quellen:

  • 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.

  • 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.

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 bereitstellt. In diesen Fällen muss das Konversationshandle als Datenelement der Statusinformationen an den Code übergeben werden, der die SEND-Anweisung enthält.

Nachrichten, die an einen Dienst in einer anderen Instanz von SQL Server Database Engine (Datenbankmodul) gesendet werden, werden in einer Übertragungswarteschlange in der aktuellen Datenbank gespeichert, bis sie an die Dienstwarteschlange in der Remoteinstanz übertragen werden können. Nachrichten, die an einen Dienst in derselben Instanz von Database Engine (Datenbankmodul) gesendet werden, werden direkt in der Warteschlange abgelegt, die dem betreffenden Dienst zugeordnet ist. Wenn eine Bedingung verhindert, dass eine Nachricht direkt in die Warteschlange des Zieldiensts eingefügt wird, kann sie solange in der Übertragungswarteschlange gespeichert werden, bis die Bedingung beseitigt wurde. Dies kann beispielsweise auftreten, wenn bestimmte Typen von Fehlern vorliegen oder wenn die Zieldienstwarteschlange inaktiv ist. Sie können in der sys.transmission_queue-Systemsicht die in einer Übertragungswarteschlange vorhandenen Nachrichten anzeigen.

Nachrichten in den Übertragungswarteschlangen für eine Instanz werden anhand folgender Kriterien der Reihe nach übertragen:

  • Prioritätsstufe ihres zugeordneten Konversationsendpunkts

  • Innerhalb der Prioritätsstufe die Sendereihenfolge in der Konversation

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. Wenn HONOR_BROKER_PRIORITY auf OFF festgelegt wird, wird allen Nachrichten in der Übertragungswarteschlange für diese Datenbank die Standardprioritätsstufe 5 zugewiesen. Die Prioritätsstufe hat für diejenigen SEND-Anweisungen keine Bedeutung, mit denen Nachrichten direkt in eine Dienstwarteschlange in derselben Instanz von Database Engine (Datenbankmodul) eingefügt werden.

Die SEND-Anweisung sperrt das Konversationshandle und nicht die Gruppe, zu der das Handle gehört.

SEND ist in einer benutzerdefinierten Funktion ungültig.

Berechtigungen

Zum Senden einer Nachricht muss der aktuelle Benutzer über die SEND-Berechtigung für den Dienst verfügen, aus dem der Dialog stammt. Falls eine Remotedienstbindung für den Dienst vorhanden ist, muss der in der Remotedienstbindung angegebene Benutzer über RECEIVE-Berechtigungen in der Warteschlange für den Dienst verfügen, aus dem der Dialog stammt.

Beispiele

Im folgenden Beispiel wird ein Dialog gestartet und eine XML-Nachricht im Dialog gesendet. Zum Senden der Nachricht wird das XML-Objekt in varbinary(max) konvertiert.

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) ;