Megosztás:


Kurzorok (SQL Server)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL-adatbázis a Microsoft Fabricben

A relációs adatbázisban végzett műveletek teljes sorkészleten működnek. Az utasítás által SELECT visszaadott sorok például az összes olyan sorból állnak, amelyek megfelelnek az WHERE utasítás záradékában foglalt feltételeknek. Az utasítás által visszaadott sorok teljes készletét eredményhalmaznak nevezzük. Az alkalmazások, különösen az interaktív online alkalmazások, nem mindig működnek hatékonyan a teljes eredménykészlettel egységként. Ezeknek az alkalmazásoknak egy olyan mechanizmusra van szükségük, amely egyszerre egy sort vagy egy kis sorblokkot tartalmaz. A kurzorok a mechanizmust biztosító eredményhalmazok bővítményei.

A kurzorok a következőkkel bővítik az eredmények feldolgozását:

  • Az eredményhalmaz adott soraiban való pozicionálás engedélyezése.

  • Egy sor vagy sorblokk beolvasása az eredményhalmaz aktuális pozíciójából.

  • Az eredményhalmaz aktuális pozíciójában lévő sorok adatmódosításainak támogatása.

  • A más felhasználók által az eredményhalmazban bemutatott adatbázisadatokon végzett módosítások láthatóságának különböző szintjeinek támogatása.

  • Transact-SQL utasítások megadása szkriptekben, tárolt eljárásokban, és az eredményhalmazban lévő adatokhoz való hozzáférést aktiválja.

Megjegyzések

Bizonyos esetekben, ha egy táblán elsődleges kulcs található, a kurzor használata helyett egy WHILE hurok is használható anélkül, hogy a kurzor többletterhelésével járna.

Vannak azonban olyan helyzetek, amikor a kurzorok nem csak elkerülhetetlenek, valójában szükség van rájuk. Ebben az esetben, ha a kurzor alapján nem szükséges frissíteni a táblákat, akkor használjon firehose kurzorokat, vagyis gyors előre- és írásvédett kurzorokat.

Kurzor implementációi

Az SQL Server három kurzor implementációt támogat.

Kurzor implementálása Description
Transact-SQL kurzorok Transact-SQL kurzorok a DECLARE CURSOR szintaxison alapulnak, és főként Transact-SQL szkriptekben, tárolt eljárásokban és eseményindítókban használatosak. Transact-SQL kurzorok a kiszolgálón vannak implementálva, és Transact-SQL ügyféltől a kiszolgálónak küldött utasítások kezelik őket. Kötegekben, tárolt eljárásokban vagy triggerekben is szerepelhetnek.
Alkalmazásprogramozási felület (API) kiszolgálói kurzorok Az API-kurzorok támogatják az API kurzorfüggvényeit az OLE DB-ben és az ODBC-ben. Az API-kiszolgáló kurzorai a kiszolgálón vannak implementálva. Minden alkalommal, amikor egy ügyfélalkalmazás meghív egy API-kurzorfüggvényt, az SQL Server natív ügyféloldali OLE DB-szolgáltatója vagy ODBC-illesztőprogramja továbbítja a kérést a kiszolgálónak, hogy az API-kiszolgáló kurzora ellen műveletet hajt végre.
Ügyfélmutatók Az ügyfélmutatókat belsőleg az SQL Server natív ügyfél ODBC-illesztőprogramja és az ADO API-t implementáló DLL implementálja. Az ügyféloldali kurzorok a kliensnél az összes eredményhalmaz-sor gyorsítótárazásával valósulnak meg. Minden alkalommal, amikor egy ügyfélalkalmazás meghív egy API-kurzorfüggvényt, az SQL Server natív ügyfél ODBC-illesztőprogramja vagy az ADO DLL végrehajtja a kurzorműveletet az ügyfélen gyorsítótárazott eredményhalmaz-sorokon.

A kurzorok típusa

Az SQL Server négy kurzortípust támogat.

Kurzorok használhatnak tempdb munkatáblákat. Csakúgy, mint a kiömlő összesítési vagy rendezési műveletek, ezek I/O-költségekkel járnak, és potenciális teljesítménybeli szűk keresztmetszetet jelentenek. STATIC a kurzorok a kezdetektől használnak munkatáblákat. További információ: a lekérdezésfeldolgozási architektúra útmutatójának munkatáblák szakasza.

Csak előre

A kurzor előre görgethetőként van megadva FORWARD_ONLY, és READ_ONLY nem támogatja a visszafelé görgetést. Ezeket firehose kurzornak is nevezik, és csak a sorok soros beolvasását támogatja a kurzor elejétől a végéig. A sorok nem lesznek lekérve az adatbázisból, amíg be nem kérik őket. Az összes INSERT, UPDATE, és DELETE utasítás hatása, amelyet a jelenlegi felhasználó tett, illetve más felhasználók véglegesítettek és amelyek befolyásolják az eredményhalmaz sorait, láthatóvá válnak, amikor a sorok lekérésre kerülnek a kurzorból.

Mivel a kurzor nem görgethető visszafelé, a sor beolvasása után az adatbázis soraiban végrehajtott módosítások többsége nem látható a kurzoron keresztül. Azokban az esetekben, amikor az eredményhalmazon belüli sor helyének meghatározására használt érték módosul, például fürtözött index által lefedett oszlopot frissít, a módosított érték a kurzoron keresztül látható.

Bár az adatbázis API-kurzormodellek eltérő típusú kurzornak tekintenek egy csak előre mutató kurzort, az SQL Server nem. Az SQL Server mind a csak előre, mind a görgetést úgy tekinti, mint a statikus, a billentyűkészlet-alapú és a dinamikus kurzorokra alkalmazható beállításokat. Transact-SQL kurzorok támogatják a csak előre statikus, kulcshalmaz alapú és dinamikus kurzorokat. Az adatbázis API-kurzormodellek feltételezik, hogy a statikus, a billentyűkészlet-alapú és a dinamikus kurzorok mindig görgethetők. Ha egy adatbázis API kurzorattribútuma vagy tulajdonsága csak továbbításra van beállítva, az SQL Server ezt csak előre mutató dinamikus kurzorként valósítja meg.

Statikus

A statikus kurzor teljes eredményhalmaza a kurzor megnyitásakor be van építve tempdb . A statikus kurzor mindig úgy jeleníti meg az eredményhalmazt, mint a kurzor megnyitásakor. A statikus kurzorok kevés vagy semmilyen változást észlelnek, de görgetés közben viszonylag kevés erőforrást használnak fel.

A kurzor nem tükrözi az adatbázisban végzett olyan módosításokat, amelyek hatással vannak az eredményhalmaz tagságára vagy az eredményhalmazt alkotó sorok oszlopaiban lévő értékek módosítására. A statikus kurzor nem jeleníti meg az adatbázisba a kurzor megnyitása után beszúrt új sorokat, még akkor sem, ha azok megfelelnek a kurzor SELECT utasítás keresési feltételeinek. Ha az eredményhalmazt alkotó sorokat más felhasználók frissítik, az új adatértékek nem jelennek meg a statikus kurzorban. A statikus kurzor megjeleníti az adatbázisból a kurzor megnyitása után törölt sorokat. Nem jelennek meg UPDATE, INSERT, vagy DELETE műveletek a statikus kurzorban (kivéve, ha a kurzort bezárták és újra megnyitották), még akkor sem, ha a módosításokat ugyanazzal a kapcsolattal hajtják végre, amely megnyitotta a kurzort.

Megjegyzés:

Az SQL Server statikus kurzorai mindig csak olvashatók.

Mivel a statikus kurzor eredményhalmaza egy munkatáblában tempdbvan tárolva, az eredményhalmaz sorainak mérete nem haladhatja meg az SQL Server-táblák maximális sorméretét.

További információ: a lekérdezésfeldolgozási architektúra útmutatójának munkatáblák szakasza. A maximális sorméretről további információt az SQL Server maximális kapacitás-specifikációi című témakörben talál.

Transact-SQL a statikus kurzorokra érzéketlen kifejezést használja. Egyes adatbázis API-k pillanatkép-kurzorként azonosítják őket.

Billentyűkészlet

A billentyűkészlet-vezérelt kurzorban lévő sorok tagsága és sorrendje a kurzor megnyitásakor lesz rögzítve. A billentyűkészlet-vezérelt kurzorokat egyedi azonosítók vagy kulcsok készlete vezérli, amelyeket kulcskészletnek neveznek. A kulcsok olyan oszlopkészletből épülnek fel, amely egyedileg azonosítja az eredményhalmaz sorait. A kulcskészlet a kurzor megnyitásakor az utasításhoz SELECT megfelelő összes sor kulcsértékeinek halmaza. A billentyűkészlet-vezérelt kurzor kulcskészlete a kurzor megnyitásakor van beépítve tempdb .

Dinamikus

A dinamikus kurzorok a statikus kurzorok ellentétei. A dinamikus kurzorok az eredményhalmazuk soraiban végrehajtott összes módosítást tükrözik, amikor végiggörgetnek a kurzoron. Az eredményhalmaz sorainak adatértékei, sorrendje és tagsága minden beolvasáskor változhat. Az összes UPDATE, INSERTés DELETE az összes felhasználó által tett utasítások a kurzoron keresztül láthatók. A frissítések azonnal láthatók, ha a kurzoron keresztül hajtják végre őket egy API-függvény, például SQLSetPos a Transact-SQL WHERE CURRENT OF záradék használatával. A kurzoron kívül végrehajtott frissítések csak véglegesítésük után láthatók, kivéve, ha a kurzor tranzakcióelkülönítési szintje nem véglegesített olvasásra van beállítva. További információ az elkülönítési szintekről: SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

Megjegyzés:

A dinamikus kurzortervek soha nem használnak térbeli indexeket.

Kurzor kérése

Az SQL Server két módszert támogat a kurzor kéréséhez:

  • Transact-SQL

    A Transact-SQL nyelv támogatja az ISO-kurzor szintaxisa után modellezett kurzorok használatát.

  • Adatbázis-alkalmazásprogramozási felület (API) kurzorfüggvényei

    Az SQL Server támogatja az adatbázis API-k kurzorfunkcióját:

    • ADO (Microsoft ActiveX Data Object)

    • OLE DB

    • ODBC (Adatbázis-kapcsolat megnyitása)

Az alkalmazásnak soha nem szabad összekevernie a kurzor kérésének két módszerét. Az API-t a kurzor viselkedésének megadására használó alkalmazások nem hajtanak végre Transact-SQL DECLARE CURSOR utasítást, hogy Transact-SQL kurzort is kérjenek. Egy alkalmazás csak akkor hajtható végre DECLARE CURSOR , ha az összes API-kurzorattribútumot visszaállítja az alapértelmezett értékre.

Ha sem Transact-SQL, sem API-kurzort nem kér, az SQL Server alapértelmezés szerint egy teljes eredménykészletet, más néven alapértelmezett eredménykészletet ad vissza az alkalmazásnak.

Kurzor művelet

Transact-SQL kurzorok és API-kurzorok szintaxisa eltérő, de a következő általános folyamatot használja az összes SQL Server-kurzor:

  1. Társítson egy kurzort egy Transact-SQL utasítás eredményhalmazához, és határozza meg a kurzor jellemzőit, például azt, hogy a kurzor sorai frissíthetők-e.

  2. Hajtsa végre a Transact-SQL utasítást a kurzor feltöltéséhez.

  3. Kérje le a megjeleníteni kívánt sorokat a kurzorban. Egy sor vagy egy sorblokk kurzorból való lekérését lekérésnek nevezzük. A sorok előre- vagy hátrafelé történő beolvasásához lekérések sorozatát görgetésnek nevezzük.

  4. Ha szükséges, végezze el a módosítási műveleteket (frissítés vagy törlés) a kurzor aktuális pozíciójának megfelelő sorban.

  5. Zárja le a kurzort.