Поделиться через


END CONVERSATION (Transact-SQL)

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

Применимо для следующих объектов: SQL Server (начиная с SQL Server 2008 до текущей версии).

Значок ссылки на раздел Cинтаксические обозначения в Transact-SQL

Синтаксис

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

Аргументы

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

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

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

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

Замечания

Завершение диалога блокирует группу сообщений, к которой относится указанный аргумент conversation_handle. При завершении диалога компонент Компонент 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 ;

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

В следующем примере диалог, определяемый дескриптором @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 ;

В.Очистка диалога, который не может быть нормально завершен

Следующий пример завершает диалог, определяемый дескриптором @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)