Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Managed Instance
Egy vagy több üzenetet is visszanyer egy sorból. A sorban lévő megtartási beállítástól függően vagy eltávolítja az üzenetet a sorból, vagy frissíti az üzenet státuszát a sorban.
Transact-SQL szintaxis konvenciók
Syntax
[ WAITFOR ( ]
RECEIVE [ TOP ( n ) ]
<column_specifier> [ ,...n ]
FROM <queue>
[ INTO table_variable ]
[ WHERE { conversation_handle = conversation_handle
| conversation_group_id = conversation_group_id } ]
[ ) ] [ , TIMEOUT timeout ]
[ ; ]
<column_specifier> ::=
{ *
| { column_name | [ ] expression } [ [ AS ] column_alias ]
} [ ,...n ]
<queue> ::=
{ database_name.schema_name.queue_name | schema_name.queue_name | queue_name }
Arguments
WAITFOR
Megadja, hogy az RECEIVE utasítás megvárja, amíg üzenet megérkezik a sorba, ha jelenleg nincs üzenet.
TOP( n )
Megadja a maximális visszaküldendő üzenetek számát. Ha ez a záradék nincs megadva, minden olyan üzenetet küldenek, amely megfelel a kijelentés kritériumának.
column_specifier
*
Megadja, hogy az eredményhalmaz tartalmazza a sor összes oszlopát.
column_name
Az eredményhalmazba bekerülni kívánt oszlop neve.
expression
Egy oszlopnév, állandó, függvény vagy bármely oszlopnevek, állandó és függvények kombinációja, amelyeket egy operátor köt össze.
column_alias
Egy alternatív név, amely az eredményhalmazban helyettesíti az oszlop nevét.
FROM
Megadja azt a sort, amely tartalmazza a vissza kell kérendő üzeneteket.
database_name
Az adatbázis neve, amely tartalmazza az üzenetek fogadásának sorát. Ha nincs adatbázis név , alapértelmezés szerint a jelenlegi adatbázis lesz.
schema_name
Az a séma neve, amely birtokolja azt a sort, ahonnan üzeneteket fogadnak. Ha nincs megadva séma név , az alapértelmezett séma a jelenlegi felhasználó alapértelmezett sémájára válik.
queue_name
A sor neve, ahonnan üzeneteket fogadnak.
BE table_variable
Megadja azt a táblaváltozót, amelybe RECEIVE az üzenetek kerülnek be. A táblaváltozónak ugyanannyi oszlopnak kell lennie, mint az üzenetekben. A táblázat változó egyes oszlopainak adattípusának implicit módon átalakíthatónak kell lennie az üzenetben szereplő megfelelő oszlop adattípusára. Ha az INTO nincs megadva, az üzenetek eredményhalmazként kerülnek vissza.
WHERE
Megadja a beszélgetést vagy csoportot a beérkezett üzenetekhez. Ha kihagyják, visszaküldi a következő elérhető beszélgetőcsoportból érkező üzeneteket.
conversation_handle = conversation_handle
Megadja a beérkezett üzenetek beszélgetését. A megadott beszélgetési azonosítónakegyedi, vagy olyan típusnak kell lennie, amely átalakítható egyedi azonosítóvá.
conversation_group_id = conversation_group_id
Megadja a befogadott üzenetek beszélgetéscsoportját. A megadott beszélgetéscsoport azonosítójánakegyedi azonosítónak kell lennie, vagy olyan típusnak, amely átalakítható egyedi azonosítóvá.
IDŐKÉRÉS
Megadja, hogy mennyi idő, milliszekundumokban, hogy az utasítás megvárjon egy üzenetet. Ez a záradék csak a WAITFOR záradékhoz használható. Ha ez a záradék nincs megadva, vagy az időkérés , -1a várakozási idő korlátlan. Ha lejár az időkérés, RECEIVE üres eredményhalmazt ad vissza.
Remarks
Important
Ha az RECEIVE utasítás nem az első mondatot egy kötetben vagy tárolt eljárásban, az előző utasítást félpillérrel (;)) kell befejezni.
Az utasítás RECEIVE üzeneteket olvas egy sorból, és eredményhalmazt ad vissza. Az eredményhalmaz nulla vagy több sorból áll, amelyek mindegyike egy üzenetet tartalmaz. Ha az INTO klauzulát nem használják, és column_specifier nem rendeli az értékeket helyi változókhoz, akkor az állítás eredményhalmazt ad vissza a hívó programnak.
Az utasítás által visszaküldött RECEIVE üzenetek különböző típusú üzenettípusok lehetnek. Az alkalmazások az message_type_name oszlopot használhatják arra, hogy minden üzenetet olyan kódhoz irányítsanak, amely kezeli a hozzá tartozó üzenettípust. Két üzenettípus létezik:
Az alkalmazás által definiált üzenettípusok, amelyeket az CREATE MESSAGE TYPE utasítás használatával hoztak létre. Az alkalmazásban definiált üzenettípusok halmaza a beszélgetéshez meghatározott Service Broker szerződés határozza meg.
Szolgáltatásügynök rendszerüzeneteket küldenek, amelyek státusz- vagy hibaadatokat adnak vissza.
Az utasítás RECEIVE eltávolítja a befogadott üzeneteket a sorból, hacsak a sor nem határozza meg az üzenetek megtartását. Amikor a RETENTION beállítás a sorban ON, az utasítás RECEIVE frissíti az status oszlopot, 0 és az üzeneteket a sorban hagyja. Amikor egy olyan tranzakció, amely tartalmaz egy RECEIVE utasítást, visszafordul, a tranzakcióban lévő sorban lévő összes változást is visszafordítják, így üzenetek visszatérnek a sorba.
Minden üzenet, amelyet egy RECEIVE nyilatkozattal visszaküldenek, ugyanabba a beszélgetési csoportba tartozik. Az RECEIVE utasítás lezárja a beszélgetési csoportot a visszaküldött üzenetek számára, amíg a tranzakció nem fejez be, amely tartalmazza az utasítást. Egy állítás olyan RECEIVE üzeneteket ad vissza, amelyek egy status .1 Az utasítással visszaadott RECEIVE eredményhalmaz implicit módon rendezett:
Ha több beszélgetésből érkező üzenetek megfelelnek a WHERE záradék feltételeinek, az utasítás RECEIVE az egyik beszélgetésből származó összes üzenetet visszaadja, mielőtt bármely más beszélgetéshez visszaküldené. A beszélgetéseket csökkenő prioritási sorrendben dolgozzák fel.
Egy adott beszélgetés esetén egy RECEIVE állítás növekvő sorrendben küld vissza üzeneteket
message_sequence_number.
Az állítás WHERE klauzulája csak egy keresési feltételt tartalmazhat, amely vagy conversation_group_idconversation_handle vagy RECEIVE a keresési feltételt használ. A keresési feltétel nem tartalmazhat egy vagy több oszlopot a sorban. Az conversation_handle or conversation_group_id nem lehet kifejezés. A visszaküldött üzenetek halmaza a WHERE klauzulánál meghatározott feltételektől függ:
Ha conversation_handle meg van jelölve, RECEIVE visszaadja az összes megadott beszélgetésből érkező üzenetet, amely elérhető a sorban.
Ha conversation_group_id meg van jelölve, RECEIVE visszaadja az összes elérhető üzenetet a sorban bármely beszélgetésből, amely a megadott beszélgetéscsoport tagja.
Ha nincs HOL záradék, RECEIVE az határozza meg, melyik beszélgetési csoport:
Van egy vagy több üzenet a sorban.
Nem zárta le egy másik RECEIVE nyilatkozattal.
A legmagasabb prioritási szinttel rendelkezik az összes ilyen kritisiumnak megfelelő beszélgetőcsoport közül.
RECEIVE Ezután visszaadja az összes elérhető üzenetet a sorban bármely beszélgetésből, amely a kiválasztott beszélgetéscsoport tagja.
Ha a WHERE klauzulában megadott beszélgetési azonosító vagy beszélgetéscsoport azonosítója nem létezik, vagy nincs hozzárendelve a megadott sorhoz, az RECEIVE utasítás hibát ad vissza.
Ha a RECEIVE kijelentésben megadott sor státusza OFF-ra van állítva, az utasítás Transact-SQL hibával megbukik.
Amikor a WAITFOR klauzulát megadják, az utasítás a megadott időkérésre vár, vagy amíg egy eredményhalmaz elérhetővé válik. Ha a sorban elhagyják, vagy a státus OFF-ra van állítva, amíg az utasítás várakozik, az utasítás azonnal hibát ad vissza. Ha az RECEIVE utasítás meghatározza a beszélgetéscsoportot vagy beszélgetési kezelőfelületet, és az adott beszélgetés szolgáltatását megszüntetik vagy áthelyezik egy másik sorba, akkor az RECEIVE utasítás Transact-SQL hibát jelent.
RECEIVE nem érvényes egy felhasználó által definiált függvényben.
A RECEIVE nyilatkozatnak nincs prioritása az éhezés megelőzésének. Ha egyetlen RECEIVE állítás zárolja a beszélgetési csoportot, és sok üzenetet nyer vissza alacsony prioritású beszélgetésekből, akkor a csoport magas prioritású beszélgetéseiből nem érkezik üzenet. Ennek megelőzésére, amikor alacsony prioritású beszélgetésekből érkező üzeneteket keresel, használd a TOP záradékot, hogy korlátozd az egyes RECEIVE állítások által letöltött üzenetek számát.
Soroszlopok
Az alábbi táblázat sorolja a sorban lévő oszlopokat:
| Oszlop név | Adattípus | Description |
|---|---|---|
status |
tinyint | Az üzenet állapota. A RECEIVE parancs által visszaküldött üzeneteknél az állapot mindig 0. A sorban lévő üzenetek az alábbi értékek egyikét tartalmazhatják:0=Készen áll1=Üzenet megérkezett2=Még nem teljes3=Megmaradt küldött üzenet |
priority |
tinyint | Az üzenetre alkalmazott beszélgetés prioritási szintje. |
queuing_order |
bigint | Az üzenetsorrend száma a sorban. |
conversation_group_id |
uniqueidentifier | Az üzenet által tartozó beszélgetéscsoporthoz tartozó azonosító. |
conversation_handle |
uniqueidentifier | A beszélgetés címe, amelynek ez az üzenet része. |
message_sequence_number |
bigint | Az üzenet sorszáma a beszélgetésen. |
service_name |
nvarchar(128) | A szolgáltatás neve, amelyhez a beszélgetés zajlik. |
service_id |
int | SQL Server objektumazonosítója annak a szolgáltatásnak, amelyhez a beszélgetés szól. |
service_contract_name |
nvarchar(128) | A szerződés neve, amit a beszélgetés követ. |
service_contract_id |
int | SQL Server objektumazonosítója annak a szerződésnek, amelyet a beszélgetés követ. |
message_type_name |
nvarchar(128) | Az üzenet típusának neve, amely az üzenet formátumát írja le. Az üzenetek lehetnek alkalmazás-üzenettípusok vagy brókerrendszer-üzenetek. |
message_type_id |
int | Az SQL Server objektumazonosítója annak az üzenettípusnak, amely leírja az üzenetet. |
validation |
nchar(2) | Az üzenethez használt validáció.E=ÜresN=NincsX=XML |
message_body |
varbinary(MAX) | Az üzenet tartalma. |
Permissions
Az üzenet megkapásához a jelenlegi felhasználónak engedélyt kell RECEIVE kell lennie a sorban.
Examples
A. Fogadd el az összes üzenetet egy beszélgetőcsoportban
A következő példa kapja az összes elérhető üzenetet a következő elérhető beszélgetéscsoporthoz a ExpenseQueue sorból. Az utasítás eredményhalmazként adja vissza az üzeneteket.
RECEIVE * FROM ExpenseQueue ;
B. Meghatározott oszlopokat kapjon az összes üzenethez egy beszélgetéscsoportban
A következő példa kapja az összes elérhető üzenetet a következő elérhető beszélgetéscsoporthoz a ExpenseQueue sorból. Az utasítás eredményhalmazként adja vissza az üzeneteket, amely tartalmazza az conversation_handleoszlopokat , message_type_name, és message_body.
RECEIVE conversation_handle, message_type_name, message_body
FROM ExpenseQueue ;
C. Fogadd meg az első elérhető üzenetet a sorban
A következő példa kapja az első elérhető üzenetet a ExpenseQueue sorból eredményhalmazként.
RECEIVE TOP (1) * FROM ExpenseQueue ;
D. Minden üzenetet megkapni egy meghatározott beszélgetéshez
A következő példa az összes elérhető üzenetet kapja meg a megadott beszélgetéshez a ExpenseQueue sorból eredményhalmazként.
DECLARE @conversation_handle UNIQUEIDENTIFIER ;
SET @conversation_handle = <retrieve conversation from database> ;
RECEIVE *
FROM ExpenseQueue
WHERE conversation_handle = @conversation_handle ;
E. Üzenetek fogadása egy meghatározott beszélgetési csoporthoz
A következő példa az adott beszélgetési csoporthoz tartozó összes elérhető üzenetet kap a ExpenseQueue sorból eredményhalmazként.
DECLARE @conversation_group_id UNIQUEIDENTIFIER ;
SET @conversation_group_id =
<retrieve conversation group ID from database> ;
RECEIVE *
FROM ExpenseQueue
WHERE conversation_group_id = @conversation_group_id ;
F. Vétel egy táblaváltozóba
A következő példa minden elérhető üzenetet kap egy meghatározott beszélgetési csoporthoz a sorból ExpenseQueue egy táblázatváltozóba.
DECLARE @conversation_group_id UNIQUEIDENTIFIER ;
DECLARE @procTable TABLE(
service_instance_id UNIQUEIDENTIFIER,
handle UNIQUEIDENTIFIER,
message_sequence_number BIGINT,
service_name NVARCHAR(512),
service_contract_name NVARCHAR(256),
message_type_name NVARCHAR(256),
validation NCHAR,
message_body VARBINARY(MAX)) ;
SET @conversation_group_id = <retrieve conversation group ID from database> ;
RECEIVE TOP (1)
conversation_group_id,
conversation_handle,
message_sequence_number,
service_name,
service_contract_name,
message_type_name,
validation,
message_body
FROM ExpenseQueue
INTO @procTable
WHERE conversation_group_id = @conversation_group_id ;
G. Üzeneteket fogadok és végtelenül várok
A következő példa minden elérhető üzenetet kap a következő elérhető beszélgetéscsoporthoz a ExpenseQueue sorban. Az utasítás megvárja, amíg legalább egy üzenet elérhetővé válik, majd visszaadja az eredményhalmazt, amely tartalmazza az összes üzenetoszlopot.
WAITFOR (
RECEIVE *
FROM ExpenseQueue) ;
H. Üzenetek fogadása és egy meghatározott intervallum várása
A következő példa minden elérhető üzenetet kap a következő elérhető beszélgetéscsoporthoz a ExpenseQueue sorban. A kijelentés 60 másodpercig vár, vagy amíg legalább egy üzenet elérhetővé válik, attól függően, melyik előbb érkezik. Az utasítás egy eredményhalmazt ad vissza, amely tartalmazza az összes üzenetoszlopot, ha legalább egy üzenet elérhető. Ellenkező esetben az állítás üres eredményhalmazt ad vissza.
WAITFOR (
RECEIVE *
FROM ExpenseQueue ),
TIMEOUT 60000 ;
I. Üzenetek fogadása, az oszlop típusának módosítása
A következő példa minden elérhető üzenetet kap a következő elérhető beszélgetéscsoporthoz a ExpenseQueue sorban. Amikor az üzenet típusa azt mondja, hogy az üzenet tartalmaz XML dokumentumot, az utasítás átalakítja az üzenet törzsét XML-re.
WAITFOR (
RECEIVE message_type_name,
CASE
WHEN validation = 'X' THEN CAST(message_body as XML)
ELSE NULL
END AS message_body
FROM ExpenseQueue ),
TIMEOUT 60000 ;
J. Üzenet fogadása, adat kinyerése az üzenet testéből, beszélgetés állapotának visszavétele
A következő példa kapja a következő elérhető üzenetet a következő elérhető beszélgetéscsoporthoz a ExpenseQueue sorban. Ha az üzenet típusa //Adventure-Works.com/Expenses/SubmitExpense, az utasítás kinyeri az alkalmazotti azonosítót és az elemek listáját az üzenet testéből. A nyilatkozat az asztalról is visszanyeri a beszélgetés ConversationState állapotát.
WAITFOR(
RECEIVE
TOP(1)
message_type_name,
COALESCE(
(SELECT TOP(1) ConversationState
FROM CurrentConversations AS cc
WHERE cc.ConversationHandle = conversation_handle),
'NEW')
AS ConversationState,
COALESCE(
(SELECT TOP(1) ErrorCount
FROM CurrentConversations AS cc
WHERE cc.ConversationHandle = conversation_handle),
0)
AS ConversationErrors,
CASE WHEN message_type_name = N'//Adventure-Works.com/Expenses/SubmitExpense'
THEN CAST(message_body AS XML).value(
'declare namespace rpt = "https://Adventure-Works.com/schemas/expenseReport"
(/rpt:ExpenseReport/rpt:EmployeeID)[1]', 'nvarchar(20)')
ELSE NULL
END AS EmployeeID,
CASE WHEN message_type_name = N'//Adventure-Works.com/Expenses/SubmitExpense'
THEN CAST(message_body AS XML).query(
'declare namespace rpt = "https://Adventure-Works.com/schemas/expenseReport"
/rpt:ExpenseReport/rpt:ItemDetail')
ELSE NULL
END AS ItemList
FROM ExpenseQueue
), TIMEOUT 60000 ;