SEND (Transact-SQL)

Envia uma mensagem usando uma ou mais conversas existentes.

Ícone de vínculo de tópico Convenções da sintaxe Transact-SQL

Sintaxe

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

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ção válido. O mesma identificador de conversação 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. Entretanto, se message_body_expression estiver presente, a expressão deverá se 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

Observação importanteImportante

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 Service Broker para os serviços na outra extremidade dessas conversas. A instrução RECEIVE é então usada 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:

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

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

Em muitos casos, o código que contém a instrução SEND é separado do código que contém as instruções BEGIN DIALOG ou RECEIVE que fornecem o indicador de conversa. Nesses casos, o identificador de conversação 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, ela poderá ser armazenada na fila de transmissão até que a condição seja resolvida. Isso ocorre, por exemplo, quando há alguns tipos de erros ou a fila de serviço de destino está ficando inativa. É possível usar a exibição do sistema sys.transmission_queue para ver as mensagens na fila de transmissão.

SEND é uma instrução atômica, quer dizer, se houver falha em uma instrução SEND em várias conversas, por exemplo, como uma conversa está em um estado com erro, nenhuma mensagem será armazenada na fila de transmissão ou colocada em qualquer 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 da 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

Referência

BEGIN DIALOG CONVERSATION (Transact-SQL)

END CONVERSATION (Transact-SQL)

RECEIVE (Transact-SQL)

sys.transmission_queue (Transact-SQL)