SEND (Transact-SQL)
Envia uma mensagem usando uma conversa existente.
Sintaxe
SEND
ON CONVERSATION conversation_handle
[ MESSAGE TYPE message_type_name ]
[ ( message_body_expression ) ]
[ ; ]
Argumentos
ON CONVERSATION conversation_handle
Especifica a conversa à qual a mensagem pertence. O conversation_handle deve conter um identificador de conversa 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 contrato deve permitir que o tipo de mensagem seja enviado desse lado da conversa. Por exemplo, o destino da conversa 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
Importante |
---|
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 do Service Broker para o serviço na outra extremidade da conversa. A instrução RECEIVE é usada, em seguida, para recuperar a mensagem enviada da fila associada ao serviço de destino.
O identificador de conversa 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 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 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. 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 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 sequência, com base em:
Nível de prioridade de seu ponto de extremidade de conversa associado.
Dentro do nível de prioridade, sua sequência de envio na conversa.
Os níveis de prioridade especificados em prioridades de conversa 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 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) ;
Consulte também