KURZOR NYILATKOZATA (Transact-SQL)

  • 2017.03.14.
  • 13 perc olvasás
    • c
    • r
    • i
    • M
    • m
    • +6

A következőre vonatkozik: SQL Server (az összes támogatott verzió ) Azure SQL Database

Meghatározza a Transact-SQL szerver kurzor attribútumait, például görgetési viselkedését és az eredményhalmaz felépítésére használt lekérdezést a kurzor működik. A DECLARE CURSOR az ISO szabványon alapuló szintaxist és a Transact-SQL kiterjesztések együttesét használó szintaxist egyaránt elfogadja.

Transact-SQL szintaxis konvenciók

Szintaxis

Megjegyzés

Az SQL Server 2014 és korábbi verzióinak Transact-SQL szintaxisának megtekintéséhez lásd: Korábbi verziók dokumentációja .

Argumentumok

kurzor_neve
Meghatározza a Transact-SQL szerver kurzor nevét. A kurzor_névnek meg kell felelnie az azonosítók szabályainak.

INSENSITIVE
Meghatározza a kurzort, amely ideiglenes másolatot készít a kurzor által használt adatokról. A kurzor összes kérésére a tempdb ezen ideiglenes táblázata válaszol; ezért az alaptáblákon végrehajtott módosítások nem tükröződnek az erre a kurzorra tett lekérések által visszaadott adatokban, és ez a kurzor nem teszi lehetővé a módosításokat. ISO szintaxis használatakor a INSENSITIVE elhagyása esetén az elkövetett törlések és az alapul szolgáló táblák (bármely felhasználó általi) frissítései megjelennek a következő lekérésekben.

SCROLL
Megadja, hogy az összes lekérési beállítás (FIRST, LAST, PRIOR, NEXT, RELATIVE, ABSOLUTE) elérhetők. Ha a SCROLL nincs megadva egy ISO DECLARE CURSOR -ben, akkor a NEXT az egyetlen támogatott letöltési opció . A SCROLL nem adható meg, ha a FAST_FORWARD is meg van adva. Ha a SCROLL nincs megadva, akkor csak a NEXT lekérési opció áll rendelkezésre, és a kurzor FORWARD_ONLY.

select_statement
Standard SELECT utasítás, amely meghatározza a kurzor eredményhalmazát. A FOR BROWSE és a INTO kulcsszavak nem engedélyezettek a kurzor deklaráció select_statement-en belül.

Az SQL Server implicit módon konvertálja a kurzor egy másik típusra, ha a select_statement tagmondatai ütköznek a kért kurzortípus funkcionalitásával.

CSAK OLVASSA EL
Megakadályozza az ezen a kurzoron keresztül végrehajtott frissítéseket. A kurzorra nem lehet hivatkozni egy WHERE CURRENT OF záradékban egy UPDATE vagy DELETE utasításban. Ez az opció felülírja a frissítendő kurzor alapértelmezett képességét.

kurzor_neve
Meghatározza a Transact-SQL szerver kurzor nevét. A kurzor_nevének meg kell felelnie az azonosítók szabályainak.

HELYI
Megadja, hogy a kurzor hatóköre lokális legyen annak a kötegnek, tárolt eljárásnak vagy eseményindítónak, amelyben a kurzort létrehozták. A kurzor neve csak ebben a körben érvényes. A kurzorra hivatkozhat a köteg, a tárolt eljárás vagy az indító helyi kurzorváltozói, vagy a tárolt eljárás paramétere OUTPUT. Egy OUTPUT paraméter segítségével a helyi kurzort visszahelyezhetjük a hívó kötegbe, tárolt eljárásba vagy triggerbe, amely hozzárendelheti a paramétert egy kurzor változóhoz, hogy a kurzor a tárolt eljárás után hivatkozhasson rá megszűnik. A kurzor implicit módon lesz osztva, amikor a köteg, a tárolt eljárás vagy az indító befejeződik, kivéve, ha a kurzort egy OUTPUT paraméterben adták vissza. Ha egy OUTPUT paraméterben adják vissza, akkor a kurzor akkor kerül elhelyezésre, amikor az utoljára hivatkozó változó el van osztva, vagy kívül esik a hatókörön.

GLOBAL
Megadja, hogy a kurzor hatóköre globális legyen a kapcsolat számára. A kurzor nevére hivatkozhat bármely tárolt eljárásban vagy kötegben, amelyet a kapcsolat hajt végre. A kurzort csak implicit módon osztják le a bontáskor.

Megjegyzés

Ha egyik sem GLOBAL vagy LOCAL van megadva, az alapértelmezettet az alapértelmezett helyi kurzor adatbázis beállítás beállítása vezérli.

FORWARD_ONLY
Megadja, hogy a kurzor csak előre mozoghat, és onnan görgethető az első az utolsó sorig. A FETCH NEXT az egyetlen támogatott lekérési lehetőség. Az aktuális felhasználó által készített (vagy más felhasználók által elkövetett) összes beszúrási, frissítési és törlési utasítás, amely befolyásolja az eredményhalmaz sorait, a sorok lehívásakor láthatóak.Mivel a kurzort nem lehet visszafelé görgetni, az adatbázis sorainak módosításai a sor lekérése után nem láthatók a kurzoron keresztül. A csak továbbított kurzorok alapértelmezés szerint dinamikusak, vagyis minden változás észlelhető az aktuális sor feldolgozásakor. Ez gyorsabb kurzornyitást tesz lehetővé, és lehetővé teszi, hogy az eredménykészlet megjelenítse az alapul szolgáló táblák frissítéseit. Míg a csak előre mutató kurzorok nem támogatják a visszafelé görgetést, az alkalmazások a kurzor bezárásával és újbóli megnyitásával visszatérhetnek a beállított eredmény elejére. Ha FORWARD_ONLY meg van adva a , KEYSET vagy DYNAMIC kulcsszavak, a kurzor dinamikus kurzorként működik. Ha sem a FORWARD_ONLY, sem a SCROLL meg van adva, akkor a FORWARD_ONLY az alapértelmezett, kivéve, ha a STATIC, KEYSET vagy DYNAMIC van megadva. STATIC, KEYSET és DYNAMIC kurzorok alapértelmezés szerint SCROLL. Ellentétben az adatbázis-API-kkal, például ODBC és ADO, a FORWARD_ONLY támogatott STATIC, KEYSET, és DYNAMIC Transact-SQL kurzorok.

STATIC
Megadja, hogy a kurzor mindig úgy jelenítse meg az eredménykészletet, mint a kurzor első megnyitásakor, és a kurzor által használt adatok ideiglenes másolata. A kurzor összes kérésére a tempdb ideiglenes táblázata válaszol. Ezért az alaptáblákba beillesztett beillesztések, frissítések és törlések nem tükröződnek az erre a kurzorra végrehajtott lekérések által visszaadott adatokban, és ez a kurzor nem észleli a kurzor megnyitása után az eredménycsoport tagságában, sorrendjében vagy értékeiben végrehajtott változásokat . A statikus kurzorok észlelhetik saját frissítéseiket, törléseiket és beszúrásaikat, bár erre nincs szükségük. Például tegyük fel, hogy egy statikus kurzor lekér egy sort, majd egy másik alkalmazás frissíti ezt a sort. Ha az alkalmazás lekéri a sort a statikus kurzorból, a látott értékek változatlanok maradnak, annak ellenére, hogy a másik alkalmazás elvégezte a változtatásokat. Minden típusú görgetés támogatott.

KEYSET
Megadja, hogy a kurzor megnyitásakor a kurzor sorainak tagsága és sorrendje rögzítésre kerül. A sorokat egyedileg azonosító kulcskészlet a tempdb-ben egy, a kulcskészlet néven ismert táblába épül be. Ez a kurzor funkcionalitást nyújt a statikus és a dinamikus kurzor között a változások észlelésének képességében. A statikus kurzorhoz hasonlóan ez sem mindig észleli az eredményhalmaz tagságának és sorrendjének változását. A dinamikus kurzorhoz hasonlóan észleli az eredményhalmaz sorainak változását. A kulcskészlet által vezérelt kurzorokat egyedi azonosítók (kulcsok) halmaza vezérli. A kulcsok olyan oszlopokból állnak, amelyek egyedileg azonosítják az eredményhalmaz sorait. A kulcskészlet a lekérdezési utasítás által visszaadott összes sor kulcsértékének halmaza. Kulcskészlet-vezérelt kurzorokkal a kurzor minden egyes sorához felépül és elment egy kulcs, amelyet vagy az ügyfél munkaállomásán, vagy a szerveren tárolnak. Az egyes sorok elérésekor a tárolt kulcs felhasználja az aktuális adatértékek lekérését az adatforrásból. A kulcskészlet által vezérelt kurzorban az eredményhalmaz tagsága lefagy, amikor a billentyűzet teljesen be van töltve. Ezt követően a tagságot érintő kiegészítések vagy frissítések nem képezik részét az eredményhalmaznak, amíg újra nem nyitják meg. Az adatértékek változásai (akár a kulcskészlet tulajdonosa, akár más folyamatok által) láthatók, amikor a felhasználó végiggörgeti az eredményhalmazt:

  • Ha egy sort törölnek, a sor lekérésére tett kísérlet @@FETCH_STATUS értéket ad vissza -2-re, mert a törölt sor résként jelenik meg az eredményhalmazban. A sor kulcsa létezik a kulcskészletben, de a sor már nem létezik az eredményhalmazban.
  • A kurzoron kívül (más folyamatok által) végrehajtott betétek csak akkor láthatók, ha a kurzor bezárult és újra megnyílt. A kurzor belsejéből készült beszúrások az eredménykészlet végén láthatók.
  • A kurzoron kívülről érkező kulcsértékek frissítései hasonlítanak a régi sor törlésére, majd az új sor beszúrására. Az új értékeket tartalmazó sor nem látható, és a régi értékekkel rendelkező sor lekérésére tett kísérletek @@FETCH_STATUS -2 értéket adnak vissza. Az új értékek akkor láthatók, ha a frissítés a kurzoron keresztül történik, a WHERE CURRENT OF záradék megadásával.

Megjegyzés

Ha a lekérdezés legalább egy táblára hivatkozik, egyedi index nélkül, akkor a kulcskészlet kurzor statikus kurzorrá konvertálódik.

DYNAMIC
Meghatároz egy kurzort, amely tükrözi a az eredménysorban beállított sorok, amikor körbetekerjük a kurzort, és új rekordot kapunk, függetlenül attól, hogy a változások a kurzor belsejéből, vagy a kurzoron kívüli más felhasználókból származnak-e. Ezért az összes felhasználó által készített összes beszúrási, frissítési és törlési utasítás látható a kurzoron keresztül.A sorok adatértékei, sorrendje és tagsága minden egyes lekéréskor változhat. A ABSOLUTE lekérési opció nem támogatott dinamikus kurzorokkal. A kurzoron kívül végzett frissítések mindaddig nem láthatók, amíg nem hajtják végre őket (kivéve, ha a kurzor tranzakció elkülönítési szintjét UNCOMMITTED értékre állítják). Tegyük fel például, hogy egy dinamikus kurzor két sort és egy másik alkalmazást kap le, majd frissíti az egyik sort, a másikat pedig törli. Ha a dinamikus kurzor ekkor beolvassa ezeket a sorokat, akkor nem találja meg a törölt sort, de megjeleníti a frissített sor új értékeit.

FAST_FORWARD
Megad egy FORWARD_ONLY, READ_ONLY kurzor a teljesítményoptimalizálások engedélyezésével. FAST_FORWARD nem adható meg, ha SCROLL vagy FOR_UPDATE is meg van adva. Ez a típusú kurzor nem engedélyezi az adatok módosítását a kurzor belsejéből.

Megjegyzés

FAST_FORWARD és FORWARD_ONLY ugyanabban a DECLARE CURSOR utasításban használható.

READ_ONLY
Megakadályozza az ezen a kurzoron keresztül végrehajtott frissítéseket. A kurzorra nem lehet hivatkozni egy WHERE CURRENT OF záradékban egy UPDATE vagy DELETE utasításban. Ez az opció felülbírálja a frissíteni kívánt kurzor alapértelmezett képességét.

SCROLL_LOCKS
Megadja, hogy a kurzoron keresztül végrehajtott pozícionált frissítések vagy törlések garantáltan sikeresek lesznek. Az SQL Server zárolja a sorokat, amikor beolvasják őket a kurzorba, hogy biztosítsák a későbbi módosítások elérhetőségét. SCROLL_LOCKS nem adható meg, ha FAST_FORWARD vagy STATIC is meg van adva.

OPTIMISTIC
Megadja, hogy a kurzoron keresztül végrehajtott pozícionált frissítések vagy törlések nem járnak sikerrel, ha a sort frissítették, mióta a kurzorba beolvasták. Az SQL Server nem zárolja be a sorokat, amikor beolvassák őket a kurzorba. Ehelyett az időbélyeg oszlop értékeinek összehasonlítását használja, vagy egy ellenőrző összeg értéket, ha a táblának nincs időbélyeg oszlopa, annak megállapítására, hogy a sor módosult-e a kurzorba olvasás után. Ha a sort módosították, a megkísérelt pozícionált frissítés vagy törlés sikertelen. A OPTIMISTIC nem adható meg, ha a FAST_FORWARD is meg van adva.

TYPE_WARNING
Megadja, hogy figyelmeztető üzenetet küldjenek az ügyfélnek, amikor a kurzor implicit módon konvertálódik a kért típusból egy másikba.

select_statement
Egy standard SELECT utasítás, amely meghatározza a kurzor eredményhalmazát. A kulcsszavak COMPUTE, COMPUTE BY, FOR BROWSE és INTO nem engedélyezettek a kurzor deklaráció select_statement-jén belül.

Megjegyzés

A kurzor deklarációjában használhat lekérdezési tippeket; ha azonban a FOR UPDATE OF záradékot is használja, akkor a FOR UPDATE OF után adja meg a OPTION (<query_hint>) szót. p>

Az SQL Server implicit módon konvertálja a kurzort egy másik típusra, ha a select_statement záradékai ütköznek a kért kurzortípus funkcionalitásával. További információ: Implicit kurzor konverziók.

Megjegyzések

DECLARE CURSOR meghatározza egy Transact-SQL szerver kurzor attribútumait, például annak görgetési viselkedés és a kurzor által működtetett eredménykészlet felépítéséhez használt lekérdezés. A OPEN utasítás feltölti az eredményhalmazt, és a FETCH egy sort ad vissza az eredményhalmazból. A CLOSE utasítás felszabadítja a kurzorhoz társított aktuális eredményhalmazt. Az DEALLOCATE utasítás felszabadítja a kurzor által használt erőforrásokat.

A DECLARE CURSOR utasítás első formája az ISO-t használja szintaktika a kurzor viselkedésének deklarálásához. Az DECLARE CURSOR második formája olyan Transact-SQL kiterjesztéseket használ, amelyek lehetővé teszik a kurzorok definiálását ugyanazokkal a kurzortípusokkal, amelyeket az ODBC vagy az ADO adatbázis API kurzorfunkcióiban használnak.

Nem keverhető össze a két forma. Ha a SCROLL vagy INSENSITIVE kulcsszavakat megadja a CURSOR kulcsszó előtt, akkor nem használhat kulcsszavak a CURSOR és a FOR <select_statement> kulcsszavak között. Ha bármilyen kulcsszót megad a CURSOR és a FOR <select_statement> kulcsszavak között, akkor nem adhatja meg a SCROLL vagy INSENSITIVE a CURSOR kulcsszó előtt.

Ha a Transact-SQL szintaxist használó DECLARE CURSOR nem adja meg a READ_ONLY, OPTIMISTIC vagy SCROLL_LOCKS, az alapértelmezett a következő:

  • Ha a SELECT utasítás nem támogatja a frissítéseket (elégtelen engedélyek, távoli táblák elérése, amelyek nem támogatják a frissítéseket stb.), a kurzor READ_ONLY.

  • STATIC és FAST_FORWARD kurzorok alapértelmezés szerint READ_ONLY.

  • DYNAMIC és KEYSET kurzorok alapértelmezés szerint OPTIMISTIC .

A kurzornevekre csak más Transact-SQL utasítások hivatkozhatnak. Az adatbázis-API függvények nem hivatkozhatnak rájuk. Például a kurzor deklarálása után a kurzor nevére nem lehet hivatkozni az OLE DB, ODBC vagy ADO függvényekből vagy módszerekből. A kurzor sorait nem lehet lekérni az API-k lekérési függvényeinek vagy metódusainak felhasználásával; a sorokat csak Transact-SQL FETCH utasításokkal lehet lekérni.

A kurzor deklarálása után ezek a rendszer által tárolt eljárások felhasználhatók a kurzor jellemzőinek meghatározására.

A rendszer által tárolt eljárások Leírás
sp_cursor_list Visszaadja a kapcsolaton jelenleg látható kurzorok listáját és azok attribútumait.
sp_describe_cursor Leírja a kurzor attribútumait, például azt, hogy csak előre vagy görgető kurzorról van-e szó.
sp_describe_kurzor_oszlopok Leírja a kurzor eredményhalmazának oszlopainak attribútumait.
sp_describe_cursor_tables Leírja a hozzáférett alaptáblákat a kurzor által.

A változókat a select_statement részeként lehet használni, amely deklarálja egy kurzort. A kurzor változó értékei nem változnak a kurzor deklarálása után.

Engedélyek

Az DECLARE CURSOR alapértelmezett engedélyei minden olyan felhasználónak, amelynek

engedélyek a kurzorban használt nézetekre, táblázatokra és oszlopokra.

Korlátozások és korlátozások

Nem használhat kurzort vagy triggereket egy táblában fürtözött oszlopáruház-index. Ez a korlátozás nem vonatkozik a nem fürtözött oszlopáruház-indexekre; használhat kurzorokat és triggereket egy nem fürtözött oszlopbolt-indexű táblán.

Példák

A. Egyszerű kurzor és szintaxis használata

A kurzor nyitásakor létrehozott eredménykészlet a táblázat összes sorát és oszlopát tartalmazza. Ez a kurzor frissíthető, és minden frissítés és törlés megjelenik a kurzorral szemben végrehajtott lekérésekben. A FETCH NEXT az egyetlen elérhető lekérés, mert a SCROLL opció nincs megadva.

B. Beágyazott kurzorok használata a jelentés kimenetének előállításához

A következő példa bemutatja, hogyan lehet beágyazni a kurzorokat összetett jelentések készítéséhez. A belső kurzort deklarálják az egyes gyártók számára.

Lásd még:

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük