RECEIVE (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure 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 áll
1=Üzenet megérkezett
2=Még nem teljes
3=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=Üres
N=Nincs
X=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 ;