Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí na:SQL ServerAzure
SQL Managed Instance
Odesílá zprávu pomocí jedné nebo více existujících konverzací.
Syntax
SEND
ON CONVERSATION [(]conversation_handle [,.. @conversation_handle_n][)]
[ MESSAGE TYPE message_type_name ]
[ ( message_body_expression ) ]
[ ; ]
Arguments
V KONVERZACI conversation_handle [.. @conversation_handle_n]
Specifikuje konverzace, do kterých zpráva patří.
conversation_handle musí obsahovat platný identifikátor konverzace. Stejný konverzační štítek nelze použít víckrát.
MESSAGE TYPE
message_type_name
Specifikuje typ zprávy odeslané zprávy. Tento typ zprávy musí být zahrnut ve smlouvách o službách používaných v těchto konverzacích. Tyto smlouvy musí umožňovat, aby typ zprávy byl odeslán z této strany konverzace. Například cílové služby konverzací mohou odesílat pouze zprávy uvedené ve smlouvě jako ODESLÁNO CÍLEM nebo ODESLÁNO KÝMKOLI. Pokud je tato klauzule vynechána, zpráva je typu zprávy .DEFAULT
message_body_expression
Poskytuje výraz reprezentující tělo zprávy.
message_body_expression je volitelný. Pokud je však message_body_expression přítomen, musí být výraz typu, který lze převést na varbinary(max). Výraz nemůže být NULL. Pokud je tato klauzule vynechána, tělo zprávy je prázdné.
Remarks
Important
Pokud SEND příkaz není prvním příkazem v dávkové nebo uložené procedurě, musí být předchozí příkaz ukončen středníkem (;).
Výpis SEND přenáší zprávu ze služeb na jednom konci jedné nebo více konverzací s Service Brokerem na služby na druhém konci těchto konverzací. Příkaz RECEIVE se pak použije k získání odeslané zprávy z front spojených s cílovými službami.
Konverzační přezdívky poskytnuté klauzuli ON CONVERSATION pocházejí ze tří zdrojů:
Když odeslaná zpráva není reakcí na zprávu přijatou od jiné služby, použijte konverzační přezdívku, která se vrací z příkazu BEGIN DIALOG, který konverzaci vytvořil.
Když je odeslaná zpráva odpovědí na zprávu dříve přijatou od jiné služby, použijte konverzační handle vrácený příkazem RECEIVE , který vrátil původní zprávu.
Kód, který obsahuje SEND příkaz, je někdy oddělený od kódu, který obsahuje buď BEGIN DIALOG, nebo RECEIVE příkazy poskytující konverzační handle. V těchto případech musí být konverzační handle jedním z datových prvků ve stavu informací, které jsou předávány do kódu obsahujícího příkaz.SEND
Zprávy, které jsou odesílány službám v jiných instancích Databázový stroj systému SQL Server, jsou uloženy v přenosové frontě v aktuální databázi, dokud nemohou být přeneseny do servisních front v vzdálených instancích. Zprávy odeslané službám ve stejné instanci Database Engine jsou přímo vloženy do front spojených s těmito službami. Pokud podmínka zabrání tomu, aby lokální zpráva šla přímo do cílové fronty služeb, může ji fronta přenosu uložit, dokud se podmínka nevyřeší. Příklady těchto výskytů zahrnují některé typy chyb nebo neaktivní frontu cílových služeb. Můžete použít sys.transmission_queue systémový pohled k zobrazení zpráv ve frontě přenosu.
SEND je atomové tvrzení. Pokud SEND příkaz odešle zprávu ve více konverzacích a selže, například když je konverzace ve stavu chyby, žádné zprávy nejsou uloženy ve frontě přenosu ani umístěny do žádné cílové servisní fronty.
Service Broker optimalizuje ukládání a přenos zpráv, které jsou odesílány ve více konverzacích ve stejném SEND výpisu.
Zprávy ve frontách přenosu pro instanci se přenášejí v posloupnosti na základě:
Úroveň priority přidruženého koncového bodu konverzace.
V rámci úrovně priority se jejich pořadí odesílání v konverzaci.
Úrovně priorit specifikované v prioritách konverzace se aplikují na zprávy ve frontě přenosu pouze tehdy, pokud je volba HONOR_BROKER_PRIORITY databáze nastavena na ZAPNUTO. Pokud je HONOR_BROKER_PRIORITY nastaveno na VYPNUTO, všechny zprávy ve frontě přenosu této databáze dostanou výchozí úroveň priority 5. Úrovně priorit se neaplikují na místoSEND, kde jsou zprávy přímo vloženy do servisní fronty ve stejné instanci jako Database Engine.
Toto SEND prohlášení samostatně uzamčuje každou konverzaci, na kterou je zpráva odeslána, aby bylo zajištěno doručení na základě objednávky v rámci konverzace.
SEND není platná v uživatelsky definované funkci.
Permissions
Pro odeslání zprávy musí mít aktuální uživatel RECEIVE oprávnění k frontě každé služby, která zprávu odešle.
Examples
Následující příklad zahajuje dialog a odesílá XML zprávu do dialogu. Pro odeslání zprávy příklad převede xml objekt na varbinary(max).
DECLARE @dialog_handle UNIQUEIDENTIFIER,
@ExpenseReport XML;
SET @ExpenseReport = <construct message as appropriate for the application>;
BEGIN DIALOG @dialog_handle
FROM SERVICE [//Adventure-Works.com/Expenses/ExpenseClient]
TO SERVICE '//Adventure-Works.com/Expenses'
ON CONTRACT [//Adventure-Works.com/Expenses/ExpenseProcessing];
SEND ON CONVERSATION @dialog_handle
MESSAGE TYPE [//Adventure-Works.com/Expenses/SubmitExpense](@ExpenseReport);
Následující příklad zahajuje tři dialogy a na každý z nich odešle XML zprávu.
DECLARE
@dialog_handle1 UNIQUEIDENTIFIER,
@dialog_handle2 UNIQUEIDENTIFIER,
@dialog_handle3 UNIQUEIDENTIFIER,
@OrderMsg XML;
SET @OrderMsg = '<construct message as appropriate for the application>';
BEGIN DIALOG @dialog_handle1
FROM SERVICE [//InitiatorDB/InitiatorService]
TO SERVICE '//TargetDB1/TargetService'
ON CONTRACT [//AllDBs/OrderProcessing];
BEGIN DIALOG @dialog_handle2
FROM SERVICE [//InitiatorDB/InitiatorService]
TO SERVICE '//TargetDB2/TargetService'
ON CONTRACT [//AllDBs/OrderProcessing];
BEGIN DIALOG @dialog_handle3
FROM SERVICE [//InitiatorDB/InitiatorService]
TO SERVICE '//TargetDB3/TargetService'
ON CONTRACT [//AllDBs/OrderProcessing];
SEND ON CONVERSATION (
@dialog_handle1,
@dialog_handle2,
@dialog_handle3
)
MESSAGE TYPE [//AllDBs/OrderMsg](@OrderMsg);
Viz také
BEGIN DIALOG CONVERSATION (Transact-SQL)
END CONVERSATION (Transact-SQL)
RECEIVE (Transact-SQL)
sys.transmission_queue (Transact-SQL)