Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Managed Instance
Dat beëindigt één kant van een bestaand gesprek.
Transact-SQL syntaxis-conventies
Syntax
END CONVERSATION conversation_handle
[ [ WITH ERROR = failure_code DESCRIPTION = 'failure_text' ]
| [ WITH CLEANUP ]
]
[ ; ]
Arguments
conversation_handle
Is het gesprekshandtak om het gesprek te beëindigen?
MET FOUT =failure_code
Is de foutcode. De failure_code is van het type int. De foutcode is een door de gebruiker gedefinieerde code die wordt opgenomen in het foutbericht dat naar de andere kant van het gesprek wordt gestuurd. De foutcode moet groter zijn dan 0.
BESCHRIJVING =failure_text
Is de foutmelding. De failure_text is van het type nvarchar(3000). De fouttekst is door de gebruiker gedefinieerde tekst die wordt opgenomen in het foutbericht dat naar de andere kant van het gesprek wordt gestuurd.
MET OPRUIMEN
Verwijdert alle berichten en catalogusweergave-items voor één kant van een gesprek die normaal niet kan worden afgerond. De andere kant van het gesprek wordt niet op de hoogte gebracht van de opruiming. Microsoft SQL Server laat het gespreks-endpoint, alle berichten voor het gesprek in de transmissiewachtrij en alle berichten voor het gesprek in de servicewachtrij vallen. Beheerders kunnen deze optie gebruiken om gesprekken te verwijderen die normaal niet kunnen worden afgerond. Als bijvoorbeeld de externe dienst permanent is verwijderd, kan een beheerder WITH CLEANUP gebruiken om gesprekken naar die dienst te verwijderen. Gebruik WITH CLEANUP niet in de code van een Service Broker-applicatie. Als END CONVERSATION WITH CLEANUP wordt uitgevoerd voordat het ontvangende eindpunt het ontvangen van een bericht bevestigt, zal het verzendende eindpunt het bericht opnieuw verzenden. Dit zou mogelijk de dialoog opnieuw kunnen afspelen.
Remarks
Het beëindigen van een gesprek vergrendelt de gespreksgroep waar de gegeven conversation_handle bij hoort. Wanneer een gesprek eindigt, verwijdert Service Broker alle berichten voor het gesprek uit de servicewachtrij.
Na afloop van een gesprek kan een applicatie geen berichten meer verzenden of ontvangen voor dat gesprek. Beide deelnemers aan een gesprek moeten oproepen END CONVERSATION om het gesprek te laten afronden. Als Service Broker geen einddialoogbericht of een foutmelding van de andere deelnemer in het gesprek heeft ontvangen, laat Service Broker de andere deelnemer in het gesprek weten dat het gesprek is beëindigd. In dit geval, hoewel de gesprekshandle voor het gesprek niet langer geldig is, blijft het eindpunt van het gesprek actief totdat de instantie die de externe dienst host het bericht bevestigt.
Als Service Broker nog geen einddialoog of foutmelding voor het gesprek heeft verwerkt, laat Service Broker de externe kant van het gesprek weten dat het gesprek is beëindigd. De berichten die Service Broker naar de externe dienst stuurt, hangen af van de gespecificeerde opties:
Als het gesprek zonder fouten eindigt en het gesprek met de externe dienst nog actief is, stuurt Service Broker een bericht van type
https://schemas.microsoft.com/SQL/ServiceBroker/EndDialognaar de externe dienst. Service Broker voegt dit bericht toe aan de transmissiewachtrij in conversatievolgorde. Service Broker stuurt alle berichten voor dit gesprek die momenteel in de transmissiewachtrij liggen voordat dit bericht wordt verzonden.Als het gesprek eindigt met een foutmelding en het gesprek met de externe dienst nog actief is, stuurt Service Broker een bericht van type
https://schemas.microsoft.com/SQL/ServiceBroker/Errornaar de externe dienst. Service Broker laat alle andere berichten voor dit gesprek vallen die momenteel in de transmissiewachtrij liggen.De clausule WITH CLEANUP stelt een databasebeheerder in staat om gesprekken te verwijderen die normaal niet kunnen worden afgerond. Deze optie verwijdert alle berichten en catalogusweergave-items voor het gesprek. Let op dat in dit geval de externe kant van het gesprek geen indicatie ontvangt dat het gesprek is beëindigd, en mogelijk geen berichten ontvangt die door een applicatie zijn verzonden maar nog niet over het netwerk zijn verzonden. Vermijd deze optie tenzij het gesprek niet normaal kan worden afgerond.
Na een gesprek veroorzaakt een Transact-SQL SEND statement die de gesprekshandle specificeert een Transact-SQL fout. Als berichten voor dit gesprek van de andere kant binnenkomen, gooit Service Broker die berichten weg.
Als een gesprek eindigt terwijl de externe dienst nog onverzonden berichten voor het gesprek heeft, verwijdert de externe dienst de onverzonden berichten. Dit wordt niet als een fout beschouwd en de externe dienst ontvangt geen melding dat berichten zijn verbroken.
Foutcodes gespecificeerd in de WITH ERROR-clausule moeten positieve getallen zijn. Negatieve nummers zijn gereserveerd voor foutmeldingen van Service Broker.
END CONVERSATION is niet geldig in een door de gebruiker gedefinieerde functie.
Permissions
Om een actief gesprek te beëindigen, moet de huidige gebruiker de eigenaar van het gesprek zijn, een lid van de sysadmin-vaste serverrol of een lid van de db_owner vaste databaserol.
Een lid van de sysadmin-vaste serverrol of een lid van de db_owner vaste databaserol kan de WITH CLEANUP gebruiken om de metadata te verwijderen voor een gesprek dat al is afgerond.
Examples
A. Een gesprek beëindigen
Het volgende voorbeeld beëindigt het dialoogvenster dat is gespecificeerd door @dialog_handle.
END CONVERSATION @dialog_handle ;
B. Een gesprek beëindigen met een fout
Het volgende voorbeeld eindigt het dialoogvenster dat door @dialog_handle is gespecificeerd met een fout als de verwerkingsinstructie een fout rapporteert. Let op dat dit een eenvoudige aanpak is voor foutafhandeling en mogelijk niet geschikt is voor sommige toepassingen.
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. Een gesprek opruimen dat niet normaal kan worden afgerond
Het volgende voorbeeld beëindigt het dialoogvenster dat is gespecificeerd door @dialog_handle. SQL Server verwijdert onmiddellijk alle berichten uit de servicewachtrij en de transmissiewachtrij, zonder de externe dienst te informeren. Omdat het beëindigen van een dialoog met opruimen de externe dienst niet op de hoogte brengt, moet je dit alleen gebruiken in gevallen waarin de externe dienst niet beschikbaar is om een EndDialog- of foutmelding te ontvangen.
END CONVERSATION @dialog_handle WITH CLEANUP;
Zie ook
BEGIN CONVERSATION TIMER (Transact-SQL)
BEGIN DIALOG CONVERSATION (Transact-SQL)
sys.gespreks_eindpunten (Transact-SQL)