END CONVERSATION (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL Managed Instance

Ez egy meglévő beszélgetés egyik oldalát zárja.

Transact-SQL szintaxis konvenciók

Syntax

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

Arguments

conversation_handle
A beszélgetés címe, hogy véget érjen a beszélgetés?

HIBA =failure_code
Ez a hibakód. A failure_codeaz int. típusú. A hibakód egy felhasználó által definiált kód, amely a beszélgetés másik oldalának küldött hibaüzenetbe is belekerül. A hibakódnak nagyobbnak kell lennie 0-nál.

LEÍRÁS =failure_text
Ez a hibaüzenet. A failure_textnvarchar(3000) típusú. A hibaüzenet egy felhasználó által definiált szöveg, amely a beszélgetés másik oldalának küldött hibaüzenetben szerepel.

A TAKARÍTÁSSAL
Eltávolítja az összes üzenetet és katalógusnézet bejegyzést egy olyan beszélgetés oldaláról, amely normál esetben nem fejezhető be. A beszélgetés másik oldalát nem értesítik a takarításról. Microsoft SQL Server eltávolítja a beszélgetés végpontját, az összes üzenetet a beszélgetéshez az átviteli sorban, valamint az összes üzenetet a szolgáltatási sorban lévő beszélgetéshez. Az adminisztrátorok ezt az opciót használhatják arra, hogy eltávolítsák azokat a beszélgetéseket, amelyek normál esetben nem fejeződnek be. Például, ha a távoli szolgáltatást véglegesen eltávolították, az adminisztrátor a WITH CLEANUP segítségével eltávolíthatja a beszélgetéseket az adott szolgáltatásból. Ne használd a WITH CLEANUP kifejezést egy Service Broker alkalmazás kódjában. Ha END CONVERSATION a WITH CLEANUP futás előtt fut le, mielőtt a fogadó végpont visszajelzést kapott, a küldő végpont újra elküldi az üzenetet. Ez potenciálisan újraindíthatja a párbeszédet.

Remarks

A beszélgetés lezárása lezárja azt a csoportot, amelyhez a megadott conversation_handle tartozik. Amikor egy beszélgetés véget ér, a Service Broker eltávolítja az összes üzenetet a beszélgetéshez a szolgáltatási sorból.

A beszélgetés vége után az alkalmazás már nem tud üzeneteket küldeni vagy fogadni ehhez a beszélgetéshez. Mindkét résztvevőnek kell szólnia END CONVERSATION , hogy a beszélgetés befejeződjön. Ha a Service Broker nem kapott végi párbeszédüzenetet vagy hibaüzenetet a beszélgetés másik résztvevőjétől, értesíti a beszélgetés másik résztvevőjét a beszélgetés végéről. Ebben az esetben, bár a beszélgetés kezelő címe már nem érvényes, a beszélgetés végpontja aktív marad, amíg a távoli szolgáltatást üzemeltető példány meg nem ismeri az üzenetet.

Ha a Service Broker még nem dolgozta fel a beszélgetés végét vagy hibaüzenetét, értesíti a beszélgetés távoli oldalát, hogy a beszélgetés véget ért. A Service Broker által a távoli szolgáltatásnak küldött üzenetek a megadott opcióktól függnek:

  • Ha a beszélgetés hibázatlanul végződik, és a távoli szolgáltatással folytatott beszélgetés továbbra is aktív, a Service Broker egy típusú https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog üzenetet küld a távoli szolgáltatásnak. A Service Broker ezt az üzenetet a kommunikációs sorrendben adja hozzá az átviteli sorhoz. A Service Broker minden üzenetet elküld ebben a beszélgetésben, amelyek jelenleg az átviteli sorban vannak, mielőtt elküldené ezt az üzenetet.

  • Ha a beszélgetés hibával ér véget, és a távoli szolgáltatással való beszélgetés továbbra is aktív, a Service Broker egy üzenetet https://schemas.microsoft.com/SQL/ServiceBroker/Error küld a távoli szolgáltatásnak. A Service Broker eltávolítja a jelenleg a továbbítási sorban lévő egyéb üzeneteket ehhez a beszélgetéshez.

  • A WITH CLEANUP záradék lehetővé teszi az adatbázis-adminisztrátor számára, hogy eltávolítsa azokat a beszélgetéseket, amelyek nem záródnak le normálisan. Ez az opció eltávolítja az összes üzenetet és katalógusnézet bejegyzést a beszélgetéshez. Figyeljük meg, hogy ebben az esetben a beszélgetés távoli oldala nem kap jelzést arról, hogy a beszélgetés véget ért, és lehet, hogy nem kap olyan üzeneteket, amelyeket egy alkalmazás küldött, de még nem továbbított a hálózaton keresztül. Kerüld ezt az opciót, hacsak a beszélgetés nem záródik le normálisan.

A beszélgetés vége után egy Transact-SQL SEND utasítás, amely megadja a beszélgetés kezelőnevét, Transact-SQL hibát okoz. Ha a beszélgetéshez érkező üzenetek a beszélgetés másik oldaláról érkeznek, a Szolgáltató eltünteti ezeket az üzeneteket.

Ha a beszélgetés akkor ér véget, amikor a távoli szolgáltatásnak még el nem küldött üzenetei vannak, a távoli szolgáltatás eltávolítja az elküldetlen üzeneteket. Ez nem minősül hibának, és a távoli szolgáltatás nem kap értesítést arról, hogy üzenetek elküldtek.

A WITH ERROR klauzuládban meghatározott hibakódoknak pozitív számoknak kell lenniük. A negatív számokat a Szolgáltató Közvetítő hibaüzeneteinek fenntartják.

END CONVERSATION nem érvényes egy felhasználó által definiált függvényben.

Permissions

Az aktív beszélgetés lezárásához a jelenlegi felhasználónak kell a beszélgetés tulajdonosának, a rendszergazdák fix szerver tagjának vagy a db_owner fix adatbázis szerepének tagjának lennie.

A rendszergazdálkodó fix szerver szerepének tagja vagy a db_owner fix adatbázis szerepének tagja a WITH CLEANUP segítségével eltávolíthatja a már befejezett beszélgetés metaadatait.

Examples

A. Egy beszélgetés lezárása

A következő példa a párbeszédet zárja, amelyet .@dialog_handle

END CONVERSATION @dialog_handle ;  

B. Egy beszélgetés végén hibával zárunk

A következő példa hibával zárja a jelölt @dialog_handle párbeszédet, ha a feldolgozási utasítás hibát jelent. Figyeld meg, hogy ez egy egyszerű hibakezelési megközelítés, és nem feltétlenül alkalmas bizonyos alkalmazásokhoz.

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. Egy beszélgetés rendje, ami nem tud normálisan befejeződni

A következő példa a párbeszédet zárja, amelyet .@dialog_handle Az SQL Server azonnal eltávolítja az összes üzenetet a szolgáltatási sorból és az átviteli sorból, anélkül, hogy értesítené a távoli szolgáltatást. Mivel a párbeszéd tisztítással befejezése nem értesíti a távoli szolgáltatást, ezt csak akkor kell használni, ha a távoli szolgáltatás nem elérhető EndDialog vagy hibaüzenet fogadására.

END CONVERSATION @dialog_handle WITH CLEANUP;