SEND (Transact-SQL)

Envía un mensaje utilizando una conversación existente.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

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

Argumentos

  • ON CONVERSATION conversation_handle
    Especifica la conversación a la que pertenece el mensaje. conversation_handle deben contener un identificador de conversación válido.

  • MESSAGE TYPE message_type_name
    Especifica el tipo del mensaje enviado. Este tipo de mensaje se debe incluir en el contrato de servicio que utiliza esta conversación. El contrato debe permitir que el tipo de mensaje se envíe desde este lado de la conversación. Por ejemplo, es posible que el destino de la conversación solo envíe mensajes especificados en el contrato como SENT BY TARGET o SENT BY ANY. Si se omite esta cláusula, el mensaje es de tipo DEFAULT.

  • message_body_expression
    Proporciona una expresión que representa el cuerpo del mensaje. message_body_expression es opcional. Sin embargo, si message_body_expression está presente, la expresión debe ser de un tipo que se pueda convertir a varbinary(max). La expresión no puede ser NULL. Si se omite esta cláusula, el cuerpo del mensaje está vacío.

Comentarios

Nota importanteImportante

Si la instrucción SEND no es la primera instrucción de un lote o procedimiento almacenado, la instrucción anterior debe finalizar con un punto y coma (;).

La instrucción SEND transmite un mensaje desde el servicio en un extremo de una conversación de Service Broker al servicio en el otro extremo de la conversación. A continuación, la instrucción RECEIVE se utiliza para recuperar el mensaje enviado desde la cola asociada al servicio de destino.

El identificador de conversación proporcionado a la cláusula ON CONVERSATION procede de uno de dos orígenes:

  • Al enviar un mensaje que no es la respuesta a un mensaje recibido de otro servicio, utilice el identificador de conversación devuelto por la instrucción BEGIN DIALOG creado por la conversación.

  • Al enviar un mensaje que es la respuesta a un mensaje previamente recibido de otro servicio, utilice el identificador de conversación devuelto por la instrucción RECEIVE que devolvió el mensaje original.

En muchos casos, el código que contiene la instrucción SEND es independiente del código que contiene las instrucciones BEGIN DIALOG o RECEIVE que proporcionan el identificador de conversación. En estos casos, el identificador de conversación debe ser uno de los elementos de datos de la información de estado que se pasa al código que contiene la instrucción SEND.

Los mensajes que se envían a un servicio de otra instancia de SQL Server Database Engine (Motor de base de datos de SQL Server) se almacenan en una cola de transmisión de la base de datos actual hasta que se puedan transmitir a la cola del servicio de la instancia remota. Los mensajes enviados a un servicio de la misma instancia del Motor de base de datos se colocan en la cola asociada a ese servicio directamente. Si una condición impide que un mensaje local se coloque en la cola de servicio de destino directamente, se puede almacenar en la cola de transmisión hasta que se resuelva la condición. Por ejemplo, esto se produce en algunos tipos de errores o cuando la cola del servicio de destino está inactiva. Puede utilizar la vista del sistema de sys.transmission_queue para ver los mensajes de una cola de transmisión.

Los mensajes de las colas de transmisión para una instancia se transmiten en secuencia, basándose en:

  • El nivel de prioridad de su extremo de conversación asociado.

  • Dentro del nivel de prioridad, su secuencia de envío en la conversación.

Los niveles de prioridad especificados en prioridades de conversación solo se aplican a los mensajes de la cola de transmisión si la opción de la base de datos HONOR_BROKER_PRIORITY está establecida en ON. Si HONOR_BROKER_PRIORITY está establecida en OFF, todos los mensajes colocados en la cola de transmisión para esa base de datos tendrán asignado el nivel de prioridad predeterminado de 5. Los niveles de prioridad no se aplican a una instrucción SEND en la que los mensajes se colocan directamente en una cola de servicio de la misma instancia de Motor de base de datos.

La instrucción SEND bloquea el identificador de conversación y no el grupo al que pertenece el identificador.

SEND no tiene validez en una función definida por el usuario.

Permisos

Para enviar un mensaje, el usuario actual debe tener el permiso SEND en el servicio del que procede el diálogo. Si existe un enlace de servicio remoto para el servicio, el usuario especificado en ese enlace de servicio remoto debe tener el permiso RECEIVE en la cola del servicio del que procede el diálogo.

Ejemplos

En el siguiente ejemplo se inicia un diálogo y se envía un mensaje XML en el diálogo. Para enviar el mensaje, el ejemplo convierte el objeto xml a 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) ;