Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Azure SQL Managed Instance
Avslutar ena sidan av en pågående konversation.
Transact-SQL syntaxkonventioner
Syntax
END CONVERSATION conversation_handle
[ [ WITH ERROR = failure_code DESCRIPTION = 'failure_text' ]
| [ WITH CLEANUP ]
]
[ ; ]
Arguments
conversation_handle
Är samtalshandtaget för att samtalet ska ta slut.
MED FEL =failure_code
Det är felkoden.
failure_code är av typ int. Felkoden är en användardefinierad kod som ingår i felmeddelandet som skickas till andra sidan av konversationen. Felkoden måste vara större än 0.
BESKRIVNING =failure_text
Är felmeddelandet.
Den failure_text är av typen nvarchar(3000). Feltexten är användardefinierad text som ingår i felmeddelandet som skickas till andra sidan av konversationen.
MED SANERING
Tar bort alla meddelanden och katalogvisningsposter för ena sidan av en konversation som inte kan slutföras normalt. Den andra sidan av samtalet får ingen information om saneringen. Microsoft SQL Server släpper konversationsändpunkten, alla meddelanden för konversationen i transmissionskön och alla meddelanden för konversationen i servicekön. Administratörer kan använda detta alternativ för att ta bort konversationer som inte kan slutföras normalt. Till exempel, om fjärrtjänsten har tagits bort permanent, kan en administratör använda WITH CLEANUP för att ta bort konversationer till den tjänsten. Använd inte WITH CLEANUP i koden för en Service Broker-applikation. Om END CONVERSATION WITH CLEANUP körs innan mottagaren bekräftar att de mottagit ett meddelande, kommer den avsendende ändpunkten att skicka meddelandet igen. Detta kan potentiellt köra dialogen igen.
Remarks
Att avsluta en konversation låser den samtalsgrupp som den givna conversation_handle tillhör. När en konversation avslutas tar Service Broker bort alla meddelanden för konversationen från tjänstekön.
Efter att en konversation avslutats kan en applikation inte längre skicka eller ta emot meddelanden för den konversationen. Båda deltagarna i samtalet måste ropa END CONVERSATION för att samtalet ska avslutas. Om Service Broker inte har mottagit ett avslutande dialogmeddelande eller ett felmeddelande från den andra deltagaren i konversationen, meddelar Service Broker den andra deltagaren att konversationen har avslutats. I detta fall, även om konversationshandtaget för konversationen inte längre är giltigt, förblir slutpunkten för konversationen aktiv tills instansen som är värd för fjärrtjänsten bekräftar meddelandet.
Om Service Broker inte redan har bearbetat en avslutad dialog eller felmeddelande för konversationen, meddelar Service Broker den fjärranslutna sidan av konversationen att konversationen är avslutad. De meddelanden som Service Broker skickar till fjärrtjänsten beror på de angivna alternativen:
Om konversationen avslutas utan fel och konversationen till fjärrtjänsten fortfarande är aktiv, skickar Service Broker ett meddelande av typ
https://schemas.microsoft.com/SQL/ServiceBroker/EndDialogtill fjärrtjänsten. Service Broker lägger till detta meddelande i överföringskön i konversationsordning. Service Broker skickar alla meddelanden för denna konversation som för närvarande finns i överföringskön innan meddelandet skickas.Om konversationen avslutas med ett fel och konversationen till fjärrtjänsten fortfarande är aktiv, skickar Service Broker ett meddelande av typ
https://schemas.microsoft.com/SQL/ServiceBroker/Errortill fjärrtjänsten. Service Broker släpper alla andra meddelanden för denna konversation som för närvarande ligger i överföringskön.WITH CLEANUP-klausulen tillåter en databasadministratör att ta bort konversationer som inte kan slutföras normalt. Detta alternativ tar bort alla meddelanden och katalogvisningsposter för konversationen. Observera att i detta fall får den fjärrstyrda sidan av konversationen ingen indikation på att konversationen har avslutats, och kanske inte tar emot meddelanden som skickats av en applikation men ännu inte överförts över nätverket. Undvik detta alternativ om inte samtalet inte kan slutföras normalt.
Efter att en konversation avslutats orsakar ett Transact-SQL-uttalande SEND som specificerar konversationshandtaget ett Transact-SQL fel. Om meddelanden för denna konversation kommer från andra sidan av samtalet, kastar Service Broker bort dessa meddelanden.
Om en konversation avslutas medan fjärrtjänsten fortfarande har oskickade meddelanden för konversationen, släpper fjärrtjänsten de oskickade meddelandena. Detta betraktas inte som ett fel, och fjärrtjänsten får ingen notis om att meddelanden har tappats.
Felkoder som anges i WITH ERROR-klausulen måste vara positiva tal. Negativa nummer är reserverade för Service Broker-felmeddelanden.
END CONVERSATION är inte giltig i en användardefinierad funktion.
Permissions
För att avsluta en aktiv konversation måste den nuvarande användaren vara ägare av konversationen, medlem av sysadmin-rollen för fast server eller medlem av den db_owner fasta databasrollen.
En medlem i sysadmin-funktionen för fast server eller en medlem i den db_owner fasta databasrollen kan använda WITH CLEANUP för att ta bort metadata för en konversation som redan är avslutad.
Examples
A. Avslutar en konversation
Följande exempel avslutar dialogen som specificeras av @dialog_handle.
END CONVERSATION @dialog_handle ;
B. Avsluta en konversation med ett fel
Följande exempel avslutar dialogen specificerad av @dialog_handle med ett fel om bearbetningssatsen rapporterar ett fel. Observera att detta är en förenklad metod för felhantering och kanske inte är lämplig för vissa tillämpningar.
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. Att städa upp i en konversation som inte kan slutföras normalt
Följande exempel avslutar dialogen som specificeras av @dialog_handle. SQL Server tar omedelbart bort alla meddelanden från tjänstekön och överföringskön, utan att meddela fjärrtjänsten. Eftersom avslut av en dialog med rensning inte meddelar fjärrtjänsten, bör du endast använda detta i fall där fjärrtjänsten inte är tillgänglig för att ta emot ett EndDialog- eller felmeddelande .
END CONVERSATION @dialog_handle WITH CLEANUP;
Se även
BEGIN CONVERSATION TIMER (Transact-SQL)
BEGIN DIALOG CONVERSATION (Transact-SQL)
sys.conversation_endpoints (Transact-SQL)