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

ESTE TEMA SE APLICA A:síSQL Server (a partir de 2008)noAzure SQL DatabasenoAzure SQL Data Warehouse noAlmacenamiento de datos paralelos THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)noAzure SQL DatabasenoAzure 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 de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax


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

ArgumentosArguments

EN la conversación 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 conversation_handle debe contener un identificador de conversación válido.The conversation_handle must contain a valid conversation identifier. El mismo identificador de conversación no se puede utilizar más de una vez.The same conversation handle cannot be used more than once.

TIPO de mensaje 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. El message_body_expression es opcional.The message_body_expression is optional. Sin embargo, si la message_body_expression está presente la expresión debe ser de un tipo que pueda convertirse 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 cannot 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.

ComentariosRemarks

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 is not 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:

  • 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.When sending a message that is not in response to a message received from another service, use the conversation handle returned from the BEGIN DIALOG statement that created the conversation.

  • 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.When sending a message that 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 muchos casos, el código que contiene la instrucción SEND es independiente del código que contiene instrucciones del BEGIN DIALOG o RECEIVE proporcionando el identificador de conversación.In many cases the code that contains the SEND statement is 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 passed to the code that contains 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 se coloque en la cola del servicio de destino directamente, se puede almacenar en la cola de transmisión hasta que se resuelva la condición.If a condition prevents a local message from being put directly in the target service queue, it can be stored in the transmission queue until the condition is resolved. Por ejemplo, esto se produce en algunos tipos de errores o cuando la cola del servicio de destino está inactiva.Examples of when this occurs include some types of errors or the target service queue being inactive. Puede usar el sys.transmission_queue vista del sistema para ver los mensajes en 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, es decir, si se produce un error en una instrucción SEND que envía un mensaje en varias conversaciones (por ejemplo, porque una conversación está en un estado de error), no se almacena ningún mensaje en la cola de transmisión ni tampoco se pone en ninguna cola de servicio de destino.SEND is an atomic statement, that is, if a SEND statement sending a message on multiple conversations fails, e.g. because a conversation is in an errored state, no messages will be 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 la base de datos HONOR_BROKER_PRIORITY está establecida en ON.Priority levels specified in conversation priorities are only 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 colocados en 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 put in the transmission queue for that database are 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 are not applied to a SEND where the messages are 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 is not valid in a user-defined function.

PermissionsPermissions

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, en el ejemplo se convierte el objeto de xml en 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) ;  

Vea tambiénSee Also

EMPEZAR conversación de diálogo ( Transact-SQL ) BEGIN DIALOG CONVERSATION (Transact-SQL)
Finalizar conversación ( Transact-SQL ) END CONVERSATION (Transact-SQL)
RECIBIR ( Transact-SQL ) RECEIVE (Transact-SQL)
Sys.transmission_queue ( Transact-SQL )sys.transmission_queue (Transact-SQL)