Share via


SEND (Transact-SQL)

Envia uma mensagem usando uma conversação existente.

Ícone de vínculo de tópicoConvenções de sintaxe Transact-SQL

Sintaxe

SEND
   ON CONVERSATION conversation_handle
   [ MESSAGE TYPE message_type_name ]
   [ ( message_body_expression ) ]
[ ; ]

Argumentos

  • ON CONVERSATION conversation_handle
    Especifica a conversação à qual a mensagem pertence. O conversation_handle deve conter um identificador de conversação válido.

  • MESSAGE TYPE message_type_name
    Especifica o tipo da mensagem enviada. Esse tipo de mensagem deve ser incluído no contrato de serviço usado por essa conversação. O contrato deve permitir que o tipo de mensagem seja enviado desse lado da conversação. Por exemplo, o destino da conversação só pode enviar 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 instrução de um procedimento em lote ou armazenado, a instrução anterior deverá ser encerrada com um ponto-e-vírgula (;).

A instrução SEND transmite uma mensagem do serviço em uma extremidade de uma conversação do Service Broker para o serviço na outra extremidade da conversação. A instrução RECEIVE é usada, em seguida, para recuperar a mensagem enviada da fila associada ao serviço de destino.

O identificador de conversação fornecido à cláusula ON CONVERSATION vem de uma de duas 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ção.

  • 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 identificador de conversação. 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 um serviço em outra instância 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 à fila do serviço na instância remota. As mensagens enviadas a um serviço na mesma instância do Mecanismo de Banco de Dados são colocadas diretamente na fila associada ao serviço. 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. Exemplos de quando isso ocorre incluem alguns tipos de erros ou a fila de serviço de destino que ficará inativa. É possível usar a exibição do sistema sys.transmission_queue para ver as mensagens em uma fila de transmissão.

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

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

  • Dentro do nível de prioridade, sua seqüência de envio na conversação.

Os níveis de prioridade especificados em prioridades de conversação só se aplicam 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 o identificador de conversação e não o grupo ao qual o identificador pertence.

A instrução 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 SEND no serviço que gera a caixa de diálogo. Se a associação de serviço remoto para o serviço existir, o usuário especificado nela deverá ter permissões RECEIVE na fila para o serviço que gera essa caixa de diálogo.

Exemplos

O exemplo a seguir inicia 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) ;