Partilhar via


END CONVERSATION (Transact-SQL)

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

Encerra um lado de uma conversa existente.

Convenções de sintaxe de Transact-SQL

Sintaxe

END CONVERSATION conversation_handle  
   [   [ WITH ERROR = failure_code DESCRIPTION = 'failure_text' ]  
     | [ WITH CLEANUP ]  
    ]  
[ ; ]  

Argumentos

conversation_handle
É o identificador de conversa para que a conversa termine.

WITH ERROR =failure_code
É o código de erro. O failure_code é do tipo int. O código de falha é um código definido pelo usuário que é incluído na mensagem de erro enviada ao outro lado da conversa. O código de falha deve ser maior que 0.

DESCRIPTION =failure_text
É a mensagem de erro. O failure_text é do tipo nvarchar(3000). O texto da falha é um texto definido pelo usuário que é incluído na mensagem de erro enviada ao outro lado da conversa.

WITH CLEANUP
Remove todas as mensagens e entradas da exibição do catálogo para um lado de uma conversa que não pode ser concluída normalmente. O outro lado da conversa não é notificado da limpeza. O Microsoft SQL Server remove o ponto de extremidade da conversa, todas as mensagens da conversa na fila de transmissão e todas as mensagens da conversa na fila de serviço. Os administradores podem usar essa opção para remover conversas que não podem ser concluídas normalmente. Por exemplo, se o serviço remoto tiver sido removido permanentemente, um administrador poderá usar WITH CLEANUP para remover conversas para esse serviço. Não use WITH CLEANUP no código de um aplicativo do Agente de Serviço. Se END CONVERSATION WITH CLEANUP for executado antes de o ponto de extremidade de recepção confirmar o recebimento de uma mensagem, o ponto de extremidade de envio enviará a mensagem novamente. Isto poderá executar novamente o diálogo.

Comentários

O encerramento de uma conversa bloqueia o grupo de conversa ao qual o conversation_handle fornecido pertence. Quando uma conversa é encerrada, o Agente de Serviço remove todas as mensagens para ela da fila de serviço.

Após o término de uma conversa, um aplicativo não pode mais enviar ou receber mensagens para essa conversa. Ambos os participantes em uma conversa devem chamar END CONVERSATION para concluir a conversa. Se o Agente de Serviço não tiver recebido uma mensagem de término do diálogo ou uma mensagem de erro do outro participante, o Agente de Serviço notificará o outro participante de que a conversa terminou. Neste caso, embora o identificador da conversa não seja mais válido, o ponto de extremidade de conversa permanece ativo até a instância que hospeda o serviço remoto confirmar a mensagem.

Se o Agente de Serviço ainda não tiver processado uma mensagem de término do diálogo ou de erro para a conversa, o Agente de Serviço notificará o lado remoto de que a conversa terminou. As mensagens que o Agente de Serviço envia ao serviço remoto dependem das opções especificadas:

  • Se a conversa terminar sem erros e a conversa com o serviço remoto ainda estiver ativa, o Agente de Serviço enviará uma mensagem do tipo https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog ao serviço remoto. O Agente de Serviço acionará essa mensagem à fila de transmissão na ordem da conversa. O Agente de Serviço envia todas as mensagens dessa conversa que estão atualmente na fila de transmissão antes de enviar esta mensagem.

  • Se a conversa terminar com um erro e a conversa com o serviço remoto ainda estiver ativa, o Agente de Serviço enviará uma mensagem do tipo https://schemas.microsoft.com/SQL/ServiceBroker/Error ao serviço remoto. Agente de Serviço remove qualquer outra mensagem desta conversa atualmente na fila de transmissão.

  • A cláusula WITH CLEANUP permite que um administrador de banco de dados remova conversas que não são concluídas normalmente. Essa opção remove todas as mensagens e entradas da exibição do catálogo para a conversa. Observe que, neste caso, o lado remoto da conversa não recebe nenhuma indicação de que a conversa terminou, e talvez não receba mensagens que tenham sido enviadas por um aplicativo e ainda não transmitidas pela rede. Evite essa opção a menos que a conversa não possa ser concluída normalmente.

Quando uma conversa termina, uma instrução SEND Transact-SQL que especifica o identificador de conversa gera um erro Transact-SQL. Se as mensagens para esta conversa chegarem do outro lado da conversa, o Agente de Serviço as descartará

Se uma conversa terminar enquanto o serviço remoto ainda não tiver enviado mensagens para ela, o serviço remoto descartará as mensagens não enviadas. Isso não é considerado um erro, e o serviço remoto não recebe nenhuma notificação de que mensagens foram descartadas.

Os códigos de falha especificados na cláusula WITH ERROR devem ser números positivos. Os números negativos são reservados para mensagens de erro do Agente de Serviço.

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

Permissões

Para terminar uma conversa ativa, o usuário atual deve ser o proprietário da conversa, um membro da função de servidor fixa sysadmin ou um membro da função de banco de dados fixa db_owner.

Um membro da função de servidor fixa sysadmin ou um membro da função de banco de dados fixa db_owner poderá usar WITH CLEANUP para remover os metadados para uma conversa que já foi concluída.

Exemplos

a. Terminando uma conversa

O exemplo a seguir encerra o diálogo especificado por @dialog_handle.

END CONVERSATION @dialog_handle ;  

B. Terminando uma conversa com um erro

O exemplo a seguir encerrará o diálogo especificado por @dialog_handle com um erro se a instrução de processamento informar um erro. Observe que esta é uma abordagem simplista de tratamento de erros, e pode não ser apropriada para alguns aplicativos.

DECLARE
    @dialog_handle UNIQUEIDENTIFIER,
    @ErrorSave INT,
    @ErrorDesc NVARCHAR(100);

BEGIN TRANSACTION;

-- Receive and process message

SET @ErrorSave = @@ERROR;

IF (@ErrorSave <> 0)
    BEGIN
        ROLLBACK TRANSACTION;
        SET @ErrorDesc = N'An error has occurred.';
        END CONVERSATION @dialog_handle
            WITH ERROR = @ErrorSave DESCRIPTION = @ErrorDesc;
    END;
ELSE
    COMMIT TRANSACTION;

C. Limpando uma conversa que não pode ser concluída normalmente

O exemplo a seguir encerra o diálogo especificado por @dialog_handle. O SQL Server remove imediatamente todas as mensagens da fila de serviço e da fila de transmissão, sem notificar o serviço remoto. Como o término de uma caixa de diálogo com a limpeza não notifica o serviço remoto, você deve usar isso apenas nos casos em que o serviço remoto não está disponível para receber uma mensagem EndDialog ou Error.

END CONVERSATION @dialog_handle WITH CLEANUP;  

Consulte Também

BEGIN CONVERSATION TIMER (Transact-SQL)
BEGIN DIALOG CONVERSATION (Transact-SQL)
sys.conversation_endpoints (Transact-SQL)