END CONVERSATION (Transact-SQL)
Encerra um lado de uma conversação existente.
Sintaxe
END CONVERSATION conversation_handle
[ [ WITH ERROR = failure_code DESCRIPTION = 'failure_text' ]
| [ WITH CLEANUP ]
]
[ ; ]
Argumentos
conversation_handle
É o identificador de conversação para que a conversação termine.WITH ERROR = failure_code
É o código de erro. 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. O código de falha deve ser maior que 0.DESCRIPTION = failure_text
É a mensagem de erro. 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ção.WITH CLEANUP
Remove todas as mensagens e entradas da exibição do catálogo para um lado de uma conversação que não pode ser concluída normalmente. O outro lado da conversação não é notificado da limpeza. O Microsoft SQL Server descarta o ponto de extremidade de conversação, todas as mensagens para a conversação na fila de transmissão e todas as mensagens para a conversação na fila de serviço. Os administradores podem usar essa opção para remover conversações 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 conversações para esse serviço. Não use WITH CLEANUP no código de um aplicativo Service Broker. 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ção bloqueia o grupo de conversação ao qual o conversation_handle fornecido pertence. Quando uma conversação é encerrada, o Service Broker remove todas as mensagens para ela da fila de serviço.
Após o término de uma conversação, um aplicativo não pode mais enviar ou receber mensagens para essa conversação. Ambos os participantes em uma conversação devem chamar END CONVERSATION para concluir a conversação. Se o Service Broker não tiver recebido uma mensagem de término do diálogo ou uma mensagem de erro do outro participante, o Service Broker notificará o outro participante de que a conversação terminou. Neste caso, embora o identificador da conversação não seja mais válido, o ponto de extremidade de conversação permanece ativo até a instância que hospeda o serviço remoto confirmar a mensagem.
Se o Service Broker ainda não tiver processado uma mensagem de término do diálogo ou de erro para a conversação, o Service Broker notificará o lado remoto de que a conversação terminou. As mensagens que o Service Broker envia ao serviço remoto dependem das opções especificadas:
Se a conversação terminar sem erros e a conversação com o serviço remoto ainda estiver ativa, o Service Broker enviará uma mensagem do tipo https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog ao serviço remoto. O Service Broker adicionará essa mensagem à fila de transmissão na ordem da conversação. O Service Broker enviará todas as mensagens dessa conversação que estiverem na fila de transmissão antes de enviar a mensagem.
Se a conversação terminar com um erro e a conversação com o serviço remoto ainda estiver ativa, o Service Broker enviará uma mensagem do tipo https://schemas.microsoft.com/SQL/ServiceBroker/Error ao serviço remoto. O Service Broker descarta quaisquer outras mensagens para essa conversação que estiverem na fila de transmissão.
A cláusula WITH CLEANUP permite que um administrador de banco de dados remova conversações 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ção. Observe que, neste caso, o lado remoto da conversação não recebe nenhuma indicação de que a conversação 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ção não possa ser concluída normalmente.
Quando uma conversação termina, uma instrução SEND Transact-SQL que especifica o identificador de conversação gera um erro Transact-SQL. Se as mensagens para esta conversação chegarem do outro lado da conversação, o Service Broker as descartará
Se uma conversação 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 Service Broker. Para obter mais informações sobre mensagens de erro do Service Broker, consulte Mensagens do sistema do Service Broker.
END CONVERSATION não é válida em uma função definida pelo usuário.
Permissões
Para terminar uma conversação ativa, o usuário atual deve ser o proprietário da conversação, 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ção que já foi concluída.
Exemplos
A. Terminando uma conversação
O exemplo a seguir encerra o diálogo especificado por @dialog_handle.
END CONVERSATION @dialog_handle ;
B. Terminando uma conversação 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ção 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 um 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 ;