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

SE APLICA A: síSQL Server (a partir de 2008) noAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server (starting with 2008) noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Envía un mensaje utilizando una o varias conversaciones existentes.Sends a message, using one or more existing conversations.

Icono de vínculo a artículo Convenciones de sintaxis de Transact-SQLArticle link icon Transact-SQL Syntax Conventions

SintaxisSyntax

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

ArgumentosArguments

ON CONVERSATION conversation_handle [.. @conversation_handle_n]ON CONVERSATION conversation_handle [.. @conversation_handle_n]
Especifica las conversaciones a las que pertenece el mensaje.Specifies the conversations that the message belongs to. El parámetro conversation_handle debe contener un identificador de conversación válido.The conversation_handle must contain a valid conversation identifier. No se puede usar más de una vez el mismo identificador de conversación.The same conversation handle can't be used more than once.

MESSAGE TYPE message_type_nameMESSAGE TYPE message_type_name
Especifica el tipo de mensaje enviado.Specifies the message type of the sent message. Este tipo de mensaje se debe incluir en los contratos de servicio que utilizan estas conversaciones.This message type must be included in the service contracts used by these conversations. Estos contratos deben permitir que el tipo de mensaje se envíe desde este lado de la conversación.These contracts must allow the message type to be sent from this side of the conversation. 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.For example, the target services of the conversations may only send messages specified in the contract as SENT BY TARGET or SENT BY ANY. Si se omite esta cláusula, el mensaje es de tipo DEFAULT.If this clause is omitted, the message is of the message type DEFAULT.

message_body_expressionmessage_body_expression
Proporciona una expresión que representa el cuerpo del mensaje.Provides an expression representing the message body. message_body_expression es opcional,The message_body_expression is optional. pero si message_body_expression está presente, la expresión debe ser de un tipo que se pueda convertir a varbinary(max).However, if the message_body_expression is present the expression must be of a type that can be converted to varbinary(max). La expresión no puede ser NULL.The expression can't be NULL. Si se omite esta cláusula, el cuerpo del mensaje está vacío.If this clause is omitted, the message body is empty.

NotasRemarks

Importante

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 (;).If the SEND statement isn't the first statement in a batch or stored procedure, the preceding statement must be terminated with a semicolon (;).

La instrucción SEND transmite un mensaje desde los servicios en un extremo de una o varias conversaciones de Service BrokerService Broker a los servicios en el otro extremo de esas conversaciones.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. A continuación, la instrucción RECEIVE se utiliza para recuperar el mensaje enviado desde las colas asociadas a los servicios de destino.The RECEIVE statement is then used to retrieve the sent message from the queues associated with the target services.

Los identificadores de conversación proporcionados a la cláusula ON CONVERSATION proceden de uno de estos tres orígenes:The conversation handles supplied to the ON CONVERSATION clause comes from one of three sources:

  • 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.When a sent message isn't in response to a message received from another service, use the conversation handle that returns from the BEGIN DIALOG statement that created the conversation.

  • Cuando un mensaje enviado es la respuesta a un mensaje previamente recibido de otro servicio, use el identificador de conversación devuelto por la instrucción RECEIVE que devolvió el mensaje original.When a sent message 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.

  • En ocasiones, 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.The code that contains the SEND statement is sometimes separate from the code that contains either the BEGIN DIALOG or RECEIVE statements supplying conversation handle. 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.In these cases, the conversation handle must be one of the data items in the state information that is passed to the code containing the SEND statement.

Los mensajes que se envían a servicios de otras instancias de Motor de base de datos de SQL ServerSQL Server Database Engine 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.Messages that are sent to services in other instances of the Motor de base de datos de SQL ServerSQL 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. Los mensajes enviados a servicios de la misma instancia del Motor de base de datosDatabase Engine se colocan directamente en las colas asociadas con esos servicios.Messages sent to services in the same instance of the Motor de base de datosDatabase Engine are put directly into the queues associated with these services. 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.If a condition prevents a local message from going directly into the target service queue, the transmission queue can store it until the condition resolves. Ejemplos de estos casos son algunos tipos de errores o la inactividad de la cola de servicio de destino.Examples of these occurrences include some types of errors or the target service queue being inactive. Puede usar la vista del sistema sys.transmission_queue para ver los mensajes de la cola de transmisión.You can use the sys.transmission_queue system view to see the messages in the transmission queue.

SEND es una instrucción atómica.SEND is an atomic statement. Si una instrucción SEND envía un mensaje en varias conversaciones y se produce un error, como cuando una conversación está en estado de error, ningún mensaje se almacenará en la cola de transmisión o se pondrá en ninguna cola de servicio de destino.If a SEND statement sends a message on multiple conversations and fails, such as when a conversation is in an errored state, no messages get stored in the transmission queue or put in any target service queue.

Service Broker optimizar el almacenamiento y la transmisión de los mensajes que se envían en varias conversaciones en la misma instrucción SEND.Service Broker optimizes the storage and transmission of messages that are sent on multiple conversations in the same SEND statement.

Los mensajes de las colas de transmisión para una instancia se transmiten en secuencia según:Messages in the transmission queues for an instance are transmitted in sequence based on:

  • El nivel de prioridad de su extremo de conversación asociado.The priority level of their associated conversation endpoint.

  • Dentro del nivel de prioridad, su secuencia de envío en la conversación.Within priority level, their send sequence in the conversation.

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.Priority levels specified in conversation priorities only get applied to messages in the transmission queue if the HONOR_BROKER_PRIORITY database option is set to 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.If HONOR_BROKER_PRIORITY is set to OFF, all messages in the transmission queue for that database get assigned the default priority level of 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 datosDatabase Engine.Priority levels don't get applied to a SEND where the messages get put directly into a service queue in the same instance of the Motor de base de datosDatabase Engine.

La instrucción SEND bloquea por separado cada conversación en la que se envía un mensaje a fin de asegurarse de que se produzca una entrega por conversación ordenada.The SEND statement separately locks each conversation on which a message is sent to ensure per-conversation ordered delivery.

SEND no tiene validez en una función definida por el usuario.SEND isn't valid in a user-defined function.

PermisosPermissions

Para enviar un mensaje, el usuario actual debe tener el permiso RECEIVE en la cola de cada servicio que envía el mensaje.To send a message, the current user must have RECEIVE permission on the queue of every service that sends the message.

EjemplosExamples

En el siguiente ejemplo se inicia un diálogo y se envía un mensaje XML en el diálogo.The following example starts a dialog and sends an XML message on the dialog. Para enviar el mensaje, el ejemplo convierte el objeto xml a varbinary(max).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) ;  

En el siguiente ejemplo se inician tres diálogos y se envía un mensaje XML en cada uno de ellos.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) ;  

Consulte tambiénSee 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)