SEND (Transact-SQL)

Aplica-se a:SQL ServerInstância Gerenciada de SQL do Azure

Envia uma mensagem usando uma ou mais conversas existentes.

Convenções de sintaxe de Transact-SQL

Sintaxe

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

Observação

Para exibir a sintaxe do Transact-SQL para o SQL Server 2014 (12.x) e versões anteriores, confira a Documentação das versões anteriores.

Argumentos

ON CONVERSATION conversation_handle [.. @conversation_handle_n]
Especifica as conversas às quais a mensagem pertence. O conversation_handle deve conter um identificador de conversa válido. O mesmo identificador de conversa não pode ser usado mais de uma vez.

MESSAGE TYPE message_type_name
Especifica o tipo da mensagem enviada. Esse tipo de mensagem deve ser incluído nos contratos de serviço usado por essas conversas. Esses contratos devem permitir que o tipo de mensagem seja enviado desse lado da conversa. Por exemplo, os serviços de destino das conversas podem enviar somente mensagens especificadas no contrato como SENT BY TARGET ou SENT BY ANY. Se essa cláusula for omitida, a mensagem será do tipo DEFAULT.

message_body_expression
Fornece uma expressão que representa o corpo de mensagem. A message_body_expression é opcional. No entanto, se message_body_expression estiver presente a expressão deverá ser de um tipo que possa ser convertido em varbinary(max). A expressão não pode ser NULL. Se essa cláusula for omitida, o corpo de mensagem será vazio.

Comentários

Importante

Se a instrução SEND não for a primeira de um procedimento em lotes ou armazenado, a instrução anterior deverá ser encerrada com um ponto-e-vírgula (;).

A instrução SEND transmite uma mensagem dos serviços em uma extremidade de uma ou mais conversas do Agente de Serviço para os serviços na outra extremidade dessas conversas. A instrução RECEIVE é usada então para recuperar a mensagem enviada das filas associadas aos serviços de destino.

Os identificadores de conversação são fornecidos à cláusula ON CONVERSATION de uma de três fontes:

  • Quando uma mensagem enviada não é uma resposta a uma mensagem recebida de outro serviço, use o identificador de conversa que retorna da instrução BEGIN DIALOG que criou a conversa.

  • Quando uma mensagem enviada é uma resposta a uma mensagem recebida anteriormente de outro serviço, use o identificador de conversa retornado pela instrução RECEIVE que retornou a mensagem original.

  • O código que contém a instrução SEND é, às vezes, separado do código que contém as instruções BEGIN DIALOG ou RECEIVE que fornecem o identificador de conversa. Nesses casos, o identificador de conversa deve ser um dos itens de dados nas informações de estado passadas ao código que contém a instrução SEND.

As mensagens que são enviadas a serviços em outras instâncias do Mecanismo de Banco de Dados do SQL Server são armazenadas em uma fila de transmissão no banco de dados atual até que possam ser transmitidas às filas do serviço nas instâncias remotas. As mensagens enviadas a serviços na mesma instância do Mecanismo de Banco de Dados são colocadas diretamente nas filas associadas a esses serviços. Se uma condição evitar que uma mensagem local seja colocada diretamente na fila de serviço de destino, a fila de transmissão poderá armazená-la até que a condição seja resolvida. Exemplos disso incluem alguns tipos de erros ou a fila de serviço de destino ficando inativa. É possível usar o modo de exibição do sistema sys.transmission_queue para ver as mensagens na fila de transmissão.

SEND é uma instrução atômica. Se uma instrução SEND que envia uma mensagem em várias conversas falhar, por exemplo, quando uma conversa está em um estado com erro, nenhuma mensagem será armazenada na fila de transmissão, nem colocada em nenhuma fila de serviço de destino.

O Service Broker otimiza o armazenamento e a transmissão de mensagens enviadas em várias conversas na mesma instrução SEND.

As mensagens nas filas de transmissão de uma instância são transmitidas em sequência, com base em:

  • Nível de prioridade de seu ponto de extremidade de conversação associado.

  • Dentro do nível de prioridade, sua sequência de envio na conversa.

Os níveis de prioridade especificados em prioridades de conversa se aplicam apenas a mensagens na fila de transmissão caso a opção de banco de dados HONOR_BROKER_PRIORITY esteja definida como ON. Se HONOR_BROKER_PRIORITY estiver definida como OFF, todas as mensagens colocadas na fila de transmissão para aquele banco de dados serão atribuídas ao nível de prioridade padrão 5. Os níveis de prioridade não são aplicados a uma instrução SEND em que as mensagens são colocadas diretamente em uma fila de serviço na mesma instância do Mecanismo de Banco de Dados.

A instrução SEND bloqueia cada conversa na qual uma mensagem é enviada separadamente para assegurar a entrega ordenada por conversa.

SEND não é válida em uma função definida pelo usuário.

Permissões

Para enviar uma mensagem, o usuário atual deve ter a permissão RECEIVE na fila de cada serviço que envia a mensagem.

Exemplos

O exemplo a seguir abre uma caixa de diálogo e envia uma mensagem XML nela. Para enviar a mensagem, o exemplo converte o objeto xml em 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);

O exemplo a seguir abre três caixas de diálogo e envia uma mensagem XML em cada uma delas.

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 Também

BEGIN DIALOG CONVERSATION (Transact-SQL)
END CONVERSATION (Transact-SQL)
RECEIVE (Transact-SQL)
sys.transmission_queue (Transact-SQL)