- 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, aWHERE 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 kurzorREAD_ONLY
. -
STATIC
ésFAST_FORWARD
kurzorok alapértelmezés szerintREAD_ONLY
. -
DYNAMIC
ésKEYSET
kurzorok alapértelmezés szerintOPTIMISTIC
.
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.