END CONVERSATION (Transact-SQL)

Platí na:SQL ServerAzureSQL Managed Instance

Ukončuje jednu stranu existujícího rozhovoru.

Transact-SQL konvence syntaxe

Syntax

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

Arguments

conversation_handle
Je to přezdívka pro ukončení konverzace.

S CHYBOU =failure_code
Je chybový kód. failure_code je typu int. Kód selhání je uživatelem definovaný kód, který je zahrnut v chybové zprávě odeslané druhé straně konverzace. Kód selhání musí být větší než 0.

POPIS =failure_text
Je chybová zpráva. failure_text je typu nvarchar(3000). Text selhání je uživatelsky definovaný text, který je zahrnut v chybové zprávě zaslané na druhou stranu konverzace.

S ÚKLIDEM
Odstraní všechny zprávy a záznamy v katalogovém zobrazení pro jednu stranu konverzace, která nemůže normálně dokončit. Druhá strana rozhovoru není o úklidu informována. Microsoft SQL Server vyřadí konverzační endpoint, všechny zprávy pro konverzaci ve frontě přenosu a všechny zprávy pro konverzaci ve frontě služeb. Administrátoři mohou tuto možnost použít k odstranění konverzací, které normálně nemohou dokončit. Například pokud byla vzdálená služba trvale odstraněna, může správce použít WITH CLEANUP k odstranění konverzací s touto službou. Nepoužívejte WITH CLEANUP v kódu aplikace Service Broker. Pokud END CONVERSATION je WITH CLEANUP spuštěn dříve, než přijímající koncový bod potvrdí přijetí zprávy, odesílající koncový bod zprávu odešle znovu. To by mohlo dialog znovu spustit.

Remarks

Ukončení konverzace uzamkne konverzační skupinu, do které daný conversation_handle patří. Když konverzace skončí, Service Broker odstraní všechny zprávy pro konverzaci z fronty služeb.

Po skončení konverzace už aplikace nemůže odesílat ani přijímat zprávy pro tuto konverzaci. Oba účastníci rozhovoru musí vyzvat k END CONVERSATION ukončení konverzace. Pokud Service Broker neobdržel závěrečnou dialogovou zprávu nebo chybovou zprávu od druhého účastníka konverzace, Service Broker informuje druhého účastníka konverzace, že konverzace skončila. V tomto případě, i když konverzační handle pro konverzaci již není platný, konec konverzace zůstává aktivní, dokud instance hostující vzdálenou službu zprávu nepotvrzí.

Pokud Service Broker ještě nezpracoval závěrečný dialog nebo chybovou zprávu konverzace, Service Broker informuje vzdálenou část konverzace, že konverzace skončila. Zprávy, které Service Broker odesílá vzdálené službě, závisí na specifikovaných možnostech:

  • Pokud konverzace skončí bez chyb a konverzace na vzdálenou službu je stále aktivní, Service Broker odešle vzdálené službě zprávu typu https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog (typ zprávy). Service Broker přidává tuto zprávu do fronty přenosu v pořadí konverzace. Service Broker odesílá všechny zprávy pro tuto konverzaci, které jsou aktuálně ve frontě pro přenos, před odesláním této zprávy.

  • Pokud konverzace skončí chybou a konverzace se vzdálenou službou je stále aktivní, Service Broker odešle vzdálené službě určitou https://schemas.microsoft.com/SQL/ServiceBroker/Error zprávu. Service Broker zanechává všechny další zprávy pro tuto konverzaci, které jsou aktuálně ve frontě přenosu.

  • Klauzule WITH CLEANUP umožňuje správce databáze odstranit konverzace, které nelze normálně dokončit. Tato možnost odstraní všechny zprávy a záznamy v katalogu pro konverzaci. Všimněte si, že v tomto případě vzdálená strana konverzace nedostává žádné indikace o ukončení konverzace a nemusí přijímat zprávy, které byly odeslány aplikací, ale ještě nebyly přeneseny přes síť. Vyhněte se této možnosti, pokud konverzace nemůže normálně proběhnout.

Po skončení konverzace způsobí Transact-SQL SEND příkaz specifikující konverzační handle chybu Transact-SQL. Pokud zprávy pro tuto konverzaci dorazí z druhé strany konverzace, Service Broker tyto zprávy vyřadí.

Pokud konverzace skončí, zatímco vzdálená služba stále obsahuje neodeslané zprávy, vzdálená služba tyto neodeslané zprávy zruší. To není považováno za chybu a vzdálená služba nedostává žádné upozornění, že zprávy byly zanechány.

Kódy poruch specifikované v klauzuli WITH ERROR musí být kladná čísla. Záporná čísla jsou vyhrazena pro chybové zprávy Service Broker.

END CONVERSATION není platná v uživatelsky definované funkci.

Permissions

Pro ukončení aktivní konverzace musí být současný uživatel vlastníkem konverzace, členem role pevného serveru správce systému nebo členem role db_owner pevné databáze.

Člen role pevného serveru správce systému nebo člen role db_owner pevné databáze může použít WITH CLEANUP k odstranění metadat konverzace, která již byla dokončena.

Examples

A. Ukončení rozhovoru

Následující příklad končí dialog specifikovaný .@dialog_handle

END CONVERSATION @dialog_handle ;  

B. Ukončení konverzace chybou

Následující příklad končí dialog specifikovaný jako chybou @dialog_handle , pokud příkaz pro zpracování hlásí chybu. Všimněte si, že jde o zjednodušený přístup k řešení chyb a nemusí být vhodný pro některé aplikace.

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. Úklid konverzace, která normálně nedokončí

Následující příklad končí dialog specifikovaný .@dialog_handle SQL Server okamžitě odstraní všechny zprávy z fronty služeb a fronty přenosu, aniž by informoval vzdálenou službu. Protože ukončení dialogu s čištěním neinformuje vzdálenou službu, měli byste ji používat pouze v případech, kdy vzdálená služba není dostupná pro přijetí zprávy EndDialog nebo chybová zpráva.

END CONVERSATION @dialog_handle WITH CLEANUP;  

Viz také

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