Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a:SQL Server
Azure SQL Managed Instance
Envía un mensaje utilizando una o varias conversaciones existentes.
Convenciones de sintaxis de Transact-SQL
Sintaxis
SEND
ON CONVERSATION [(]conversation_handle [,.. @conversation_handle_n][)]
[ MESSAGE TYPE message_type_name ]
[ ( message_body_expression ) ]
[ ; ]
Argumentos
SOBRE CONVERSACIÓN conversation_handle [.. @conversation_handle_n]
Especifica las conversaciones a las que pertenece el mensaje. El parámetro conversation_handle debe contener un identificador de conversación válido. No se puede usar más de una vez el mismo identificador de conversación.
MESSAGE TYPE
message_type_name
Especifica el tipo de mensaje enviado. Este tipo de mensaje se debe incluir en los contratos de servicio que utilizan estas conversaciones. Estos contratos deben permitir que el tipo de mensaje se envíe desde este lado de la conversación. Por ejemplo, es posible que los servicios de destino de las conversaciones solo envíen mensajes especificados en el contrato como SENT BY TARGET o SENT BY ANY. Si se omite esta cláusula, el mensaje es del tipo DEFAULTde mensaje .
message_body_expression
Proporciona una expresión que representa el cuerpo del mensaje.
message_body_expression es opcional, pero 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.
Observaciones
Importante
Si la SEND sentencia no es la primera de un procedimiento por lotes o almacenado, la anterior debe terminarse con punto y coma (;).
La SEND declaración transmite un mensaje desde los servicios en un extremo de una o más conversaciones con el Corredor de Servicios hacia los servicios en el otro extremo de estas conversaciones. La RECEIVE instrucción se utiliza entonces para recuperar el mensaje enviado de las colas asociadas a los servicios objetivo.
Los identificadores de conversación proporcionados a la cláusula ON CONVERSATION proceden de uno de estos tres orígenes:
Cuando un mensaje enviado no es la respuesta a un mensaje recibido de otro servicio, use el identificador de conversación devuelto por la instrucción BEGIN DIALOG que creó la conversación.
Cuando un mensaje enviado es una respuesta a un mensaje previamente recibido de otro servicio, utiliza el handle de conversación que devuelve la RECEIVE instrucción que devolvió el mensaje original.
El código que contiene la SEND instrucción a veces es independiente del código que contiene el DIÁLOGO INICIAR o RECEIVE las sentencias que proporcionan el handle de conversación. En estos casos, el handle de conversación debe ser uno de los elementos de datos en la información de estado que se pasa al código que contiene la SEND sentencia.
Los mensajes que se envían a servicios de otras instancias de 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 las colas de servicio de las instancias remotas. Los mensajes enviados a servicios de la misma instancia del Motor de base de datos se colocan directamente en las colas asociadas con esos servicios. Si una condición impide que un mensaje local vaya directamente a la cola de servicio de destino, la cola de transmisión puede almacenarlo hasta que se resuelva la condición. Ejemplos de estos casos son algunos tipos de errores o la inactividad de la cola de servicio de destino. Puede usar la vista del sistema sys.transmission_queue para ver los mensajes de la cola de transmisión.
SEND es una afirmación atómica. Si una SEND instrucción envía un mensaje en varias conversaciones y falla, como cuando una conversación está en estado de error, ningún mensaje se almacena en la cola de transmisión ni se coloca en ninguna cola de servicio destino.
Service Broker optimiza el almacenamiento y la transmisión de mensajes que se envían en múltiples conversaciones dentro de la misma SEND instrucción.
Los mensajes de las colas de transmisión para una instancia se transmiten en secuencia según:
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 base de datos HONOR_BROKER_PRIORITY está establecida en ON. Si HONOR_BROKER_PRIORITY está establecida en OFF, todos los mensajes de 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 SEND un lugar donde los mensajes se colocan directamente en una cola de servicio en la misma instancia del Motor de base de datos.
La SEND declaración bloquea por separado cada conversación en la que se envía un mensaje para asegurar la entrega ordenada por conversación.
SEND no es válido en una función definida por el usuario.
Permisos
Para enviar un mensaje, el usuario actual debe tener RECEIVE permiso en la cola de cada servicio que envía el mensaje.
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);
En el siguiente ejemplo se inician tres diálogos y se envía un mensaje XML en cada uno de ellos.
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);
Vea también
BEGIN DIALOG CONVERSATION (Transact-SQL)
END CONVERSATION (Transact-SQL)
RECEIVE (Transact-SQL)
sys.transmission_queue (Transact-SQL)