END CONVERSATION (Transact-SQL)

Применимо к:SQL Server Управляемый экземпляр SQL Azure

Завершает одну из сторон существующего диалога.

Соглашения о синтаксисе Transact-SQL

Синтаксис

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

Примечание.

Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.

Аргументы

conversation_handle
Дескриптор завершаемого диалога.

WITH ERROR =код_ошибки
Код ошибки. Failure_code имеет тип int. Код сбоя — это определяемый пользователем код, включенный в сообщение об ошибке, отправляемый в другую сторону беседы. Код ошибки должен быть больше 0.

DESCRIPTION =описание_ошибки
Сообщение об ошибке. Параметр описание_ошибки имеет тип nvarchar(3000). Текст ошибки — это определяемый пользователем текст, который включается в сообщение об ошибке, отсылаемое другой стороне диалога.

WITH CLEANUP
Удаляет все сообщения и записи представлений каталога для одной стороны диалога, которая не может завершиться нормально. Другая сторона диалога не уведомляется об очистке. Microsoft SQL Server удаляет конечную точку беседы, все сообщения для беседы в очереди передачи и все сообщения для беседы в очереди служб. Администраторы могут использовать этот параметр для удаления диалогов, которые не могут быть нормально завершены. Например, если удаленная служба безвозвратно удалена, администратор может использовать параметр WITH CLEANUP для удаления диалогов, работающих с этой службой. Не используйте WITH CLEANUP в коде приложения Service Broker. Если инструкция END CONVERSATION WITH CLEANUP будет запущена до того, как получающая конечная точка подтвердит получение сообщения, то отправляющая конечная точка пошлет сообщение повторно. Потенциально это может вызвать повторный запуск диалога.

Замечания

При завершении диалога блокируется группа сообщений, к которой относится указанный аргумент дескриптор_диалога. Когда беседа заканчивается, Service Broker удаляет все сообщения для беседы из очереди служб.

После того как диалог завершен, приложение больше не может отправлять и получать сообщения. Оба участника диалога должны вызвать инструкцию END CONVERSATION для его завершения. Если Service Broker не получил сообщение о завершении диалога или сообщение об ошибке от другого участника беседы, Компонент Service Broker уведомляет другого участника беседы о завершении беседы. В этом случае, несмотря на то, что дескриптор диалога уже недействителен, конечная точка диалога остается активной до тех пор, пока экземпляр, на котором находится служба, не подтвердит сообщение.

Если Компонент Service Broker еще не обработал диалоговое окно или сообщение об ошибке для беседы, компонент Service Broker уведомляет удаленную сторону беседы о завершении беседы. Сообщения, отправляемые Service Broker в удаленную службу, зависят от указанных параметров:

  • Если беседа завершается без ошибок, а беседа в удаленной службе по-прежнему активна, Service Broker отправляет сообщение типа https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog в удаленную службу. Service Broker добавляет это сообщение в очередь передачи в порядке беседы. Service Broker отправляет все сообщения для этой беседы, которые в настоящее время находятся в очереди передачи перед отправкой этого сообщения.

  • Если беседа заканчивается ошибкой и беседа в удаленной службе по-прежнему активна, Service Broker отправляет сообщение типа https://schemas.microsoft.com/SQL/ServiceBroker/Error в удаленную службу. Service Broker удаляет любые другие сообщения для этой беседы в настоящее время в очереди передачи.

  • Предложение WITH CLEANUP позволяет администратору базы данных удалять диалоги, которые не могут быть завершены нормальным способом. Этот параметр удаляет все сообщения и элементы представления каталога для данного диалога. Обратите внимание, что в этом случае удаленная сторона диалога не получает никакого сигнала о том, что диалог завершен, и не сможет получить сообщения, которые были отправлены приложением, но еще не были переданы по сети. Старайтесь не пользоваться этим параметром, если диалог может быть завершен нормально.

После завершения диалога инструкция SEND языка Transact-SQL, в которой указан дескриптор диалога, вызовет ошибку Transact-SQL. Если сообщения для этой беседы поступают с другой стороны беседы, Service Broker не карта эти сообщения.

Если на момент завершения диалога у удаленной службы остались неотправленные сообщения, они будут удалены. Это не рассматривается как ошибка, и удаленная служба не получит уведомления о том, что сообщения удалены.

Код ошибки, указанный в предложении WITH ERROR, должен быть положительным числом. Отрицательные числа зарезервированы для сообщений об ошибках Service Broker.

Инструкция END CONVERSATION не может применяться в определяемой пользователем функции.

Разрешения

Для завершения активного диалога текущий пользователь должен быть его владельцем, членом предопределенной роли сервера sysadmin или предопределенной роли базы данных db_owner.

Член предопределенной роли сервера sysadmin или предопределенной роли базы данных db_owner может указывать предложение WITH CLEANUP для удаления метаданных диалога, который уже завершен.

Примеры

А. Завершение диалога

Следующий пример завершает диалог, определяемый дескриптором @dialog_handle.

END CONVERSATION @dialog_handle ;  

B. Завершение диалога с ошибкой

В следующем примере диалог, определяемый дескриптором @dialog_handle, завершается с ошибкой, если обрабатываемая инструкция сообщила об ошибке. Обратите внимание, что этот упрощенный подход к обработке ошибок может не подойти для некоторых приложений.

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. Очистка диалога, который не может быть нормально завершен

Следующий пример завершает диалог, определяемый дескриптором @dialog_handle. SQL Server немедленно удаляет все сообщения из очереди служб и очереди передачи без уведомления удаленной службы. Поскольку при завершении диалога с очисткой удаленная служба не уведомляется, этот способ следует использовать только в тех случаях, когда удаленная служба недоступна и не может получить сообщение EndDialog или Error.

END CONVERSATION @dialog_handle WITH CLEANUP;  

См. также

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