SEND (Transact-SQL)

Invia un messaggio, utilizzando una conversazione già esistente.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

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

Argomenti

  • ON CONVERSATION conversation_handle
    Specifica la conversazione alla quale appartiene il messaggio. conversation_handle deve contenere un identificatore di conversazione valido.

  • MESSAGE TYPE message_type_name
    Specifica il tipo di messaggio del messaggio inviato. Questo tipo di messaggio deve essere incluso nel contratto di servizio utilizzato da questa conversazione. Il contratto deve consentire al tipo di messaggio di essere inviato da questo lato della conversazione. Ad esempio, la destinazione della conversazione può soltanto inviare messaggi specificati nel contratto come SENT BY TARGET o SENT BY ANY. Se questa clausola viene omessa, il messaggio sarà del tipo DEFAULT.

  • message_body_expression
    Fornisce un'espressione che rappresenta il corpo del messaggio. message_body_expression è facoltativo. Se tuttavia message_body_expression è presente, l'espressione deve essere di un tipo convertibile in varbinary(max). L'espressione non può essere NULL. Se questa clausola viene omessa, il corpo del messaggio sarà vuoto.

Osservazioni

Nota importanteImportante

Se l'istruzione SEND non è la prima istruzione in un batch o in una stored procedure, l'istruzione precedente deve terminare con un punto e virgola (;).

L'istruzione SEND trasmette un messaggio dal servizio su un lato di una conversazione di Service Broker al servizio sull'altro lato della conversazione. L'istruzione RECEIVE viene quindi utilizzata per recuperare il messaggio inviato dalla coda associata al servizio di destinazione.

L'handle di conversazione fornito alla clausola ON CONVERSATION deriva da una delle due origini seguenti:

  • Quando viene inviato un messaggio non in risposta a un messaggio ricevuto da un altro servizio, utilizzare l'handle di conversazione restituito dall'istruzione BEGIN DIALOG che ha creato la conversazione.

  • Quando viene inviato un messaggio in risposta a un messaggio ricevuto in precedenza da un altro servizio, utilizzare l'handle di conversazione restituito dall'istruzione RECEIVE che ha restituito il messaggio originale.

In molti casi, il codice che contiene l'istruzione SEND è separato dal codice che contiene l'istruzione BEGIN DIALOG or RECEIVE che fornisce l'handle di conversazione. In questi casi, l'handle di conversazione deve essere uno degli elementi di dati nelle informazioni sullo stato passate al codice contenente l'istruzione SEND.

I messaggi inviati a un servizio in un'altra istanza del Motore di database di SQL Server vengono archiviati in una coda di trasmissione nel database corrente fino a quando non vengono trasmessi alla coda del servizio nell'istanza remota. I messaggi inviati a un servizio nella stessa istanza del Motore di database vengono inseriti direttamente nella coda associata a tale servizio. Se una condizione impedisce di inserire un messaggio locale direttamente nella coda del servizio di destinazione, il messaggio può essere archiviato nella coda di trasmissione fino quando la condizione non viene risolta. Questo può accadere quando si verificano alcuni tipi di errori o quando la coda del servizio di destinazione non è attiva. Per visualizzare i messaggi in una coda di trasmissione, è possibile utilizzare la vista di sistema sys.transmission_queue.

I messaggi nelle code di trasmissione per un'istanza sono trasmessi in sequenza in base a:

  • Livello di priorità dell'endpoint di conversazione associato.

  • All'interno del livello di priorità, la sequenza di invio nella conversazione.

I livelli di priorità specificati nelle priorità di conversazione sono applicati ai messaggi nella coda di trasmissione solo se l'opzione di database HONOR_BROKER_PRIORITY è impostata su ON. Se l'opzione HONOR_BROKER_PRIORITY è impostata su OFF, a tutti i messaggi inseriti nella coda di trasmissione per tale database viene assegnato il livello di priorità predefinito di 5. I livelli di priorità non vengono applicati a un'istruzione SEND se i messaggi vengono inseriti direttamente in una coda del servizio nella stessa istanza del Motore di database.

L'istruzione SEND blocca l'handle di conversazione e non il gruppo a cui appartiene l'handle.

L'istruzione SEND non è valida in una funzione definita dall'utente.

Autorizzazioni

Per inviare un messaggio, l'utente corrente deve disporre dell'autorizzazione SEND per il servizio da cui proviene il dialogo. Se esiste un'associazione al servizio remoto per il servizio, l'utente specificato in quell'associazione al servizio remoto deve disporre delle autorizzazioni RECEIVE nella coda per il servizio da cui proviene il dialogo.

Esempi

Nell'esempio seguente viene avviato un dialogo e viene inviato un messaggio XML nel dialogo. Per inviare il messaggio, l'oggetto xml viene convertito in 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) ;