logo

Kurzor az SQL Serverben

Az SQL Server kurzora egy d atabase objektum, amely lehetővé teszi számunkra, hogy egyszerre lekérjük az egyes sorokat, és manipuláljuk az adatait . A kurzor nem más, mint egy sorra mutató mutató. Mindig a SELECT utasítással együtt használatos. Ez általában egy gyűjtemény SQL logika, amely egyenként előre meghatározott számú soron megy keresztül. A kurzor egyszerű illusztrációja, amikor kiterjedt adatbázisunk van a dolgozók nyilvántartásairól, és ki szeretnénk számítani minden dolgozó fizetését az adók és a szabadságok levonása után.

Az SQL Server A kurzor célja az adatok soronkénti frissítése, megváltoztatása, vagy olyan számítások elvégzése, amelyek nem lehetségesek, ha az összes rekordot egyszerre lekérjük. . Hasznos továbbá olyan adminisztratív feladatok végrehajtásához, mint az SQL Server adatbázis-biztonsági mentései sorrendben. A kurzorokat főleg a fejlesztési, DBA és ETL folyamatokban használják.

Ez a cikk mindent elmagyaráz az SQL Server kurzoráról, például a kurzor életciklusáról, a kurzor használatának okáról és időpontjáról, a kurzorok megvalósításáról, korlátairól és a kurzor cseréjéről.

A kurzor életciklusa

Leírhatjuk a kurzor életciklusát a öt különböző szakasz alábbiak szerint:

Kurzor az SQL Serverben

1: Kurzor deklarálása

Az első lépés a kurzor deklarálása az alábbi SQL utasítással:

karakterlánc bevitele java-ban
 DECLARE cursor_name CURSOR FOR select_statement; 

A kurzort úgy deklarálhatjuk, hogy a DECLARE kulcsszó után a CURSOR adattípussal adjuk meg a nevét. Ezután megírjuk a SELECT utasítást, amely meghatározza a kurzor kimenetét.

2: Nyissa meg a kurzort

Ez egy második lépés, amelyben megnyitjuk a kurzort az eredményhalmazból lekért adatok tárolására. Ezt az alábbi SQL utasítás használatával tehetjük meg:

 OPEN cursor_name; 

3: Kurzor lekérése

Ez egy harmadik lépés, amelyben a sorok egyenként vagy blokkban is lekérhetők az adatok manipulálására, például beszúrási, frissítési és törlési műveletekre a kurzor aktuálisan aktív sorában. Ezt az alábbi SQL utasítás használatával tehetjük meg:

 FETCH NEXT FROM cursor INTO variable_list; 

Használhatjuk azt is @@FETCHSTATUS függvény az SQL Serverben, hogy lekérje a kurzorral szemben végrehajtott legutóbbi FETCH utasítás kurzor állapotát. A FETCH utasítás sikeres volt, amikor a @@FETCHSTATUS nulla kimenetet ad. A MÍG utasítás használható az összes rekord lekérésére a kurzorból. A következő kód világosabban magyarázza ezt:

 WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM cursor_name; END; 

4: Kurzor bezárása

Ez egy negyedik lépés, amelyben a kurzort be kell zárni, miután befejeztük a kurzorral végzett munkát. Ezt az alábbi SQL utasítás használatával tehetjük meg:

 CLOSE cursor_name; 

5: Kurzor lefoglalása

Ez az ötödik és egyben utolsó lépés, amelyben töröljük a kurzordefiníciót, és felszabadítjuk a kurzorral társított összes rendszererőforrást. Ezt az alábbi SQL utasítás használatával tehetjük meg:

 DEALLOCATE cursor_name; 

Az SQL Server Cursor használata

Tudjuk, hogy a relációs adatbázis-kezelő rendszerek, köztük az SQL Server, kiválóan kezelik az eredményhalmazoknak nevezett sorok adatait. Például , van egy asztalunk termék_táblázat amely tartalmazza a termékleírásokat. Ha frissíteni szeretnénk a ár a termékről, majd az alábbi FRISSÍTÉS a lekérdezés frissíti az összes olyan rekordot, amely megfelel a ' AHOL' kikötés:

 UPDATE product_table SET unit_price = 100 WHERE product_id = 105; 

Néha az alkalmazásnak egyenként kell feldolgoznia a sorokat, azaz soronként, nem pedig a teljes eredménykészletet egyszerre. Ezt a folyamatot kurzorok használatával végezhetjük el az SQL Serverben. A kurzor használata előtt tudnunk kell, hogy a kurzorok teljesítménye nagyon rossz, ezért mindig csak akkor használja, ha a kurzoron kívül nincs más opció.

A kurzor ugyanazt a technikát használja, mint a FOREACH, FOR, WHILE, DO WHILE ciklusokat, hogy egyszerre egy objektumot iteráljunk minden programozási nyelven. Ezért azért választható, mert ugyanazt a logikát alkalmazza, mint a programozási nyelv hurkolási folyamata.

A kurzorok típusai az SQL Serverben

Az alábbiakban felsoroljuk az SQL Server különböző típusú kurzorait:

  • Statikus kurzorok
  • Dinamikus kurzorok
  • Csak előremutató kurzorok
  • Keyset kurzorok
Kurzor az SQL Serverben

Statikus kurzorok

A statikus kurzor által megjelenített eredménykészlet mindig ugyanaz, mint a kurzor első megnyitásakor. Mivel a statikus kurzor tárolja az eredményt tempdb , mindig azok csak olvasható . A statikus kurzor segítségével előre és hátra mozoghatunk. Más kurzorokkal ellentétben lassabb és több memóriát fogyaszt. Emiatt csak akkor tudjuk használni, ha görgetés szükséges, és más kurzorok nem megfelelőek.

Ez a kurzor azokat a sorokat jeleníti meg, amelyeket a megnyitás után eltávolítottunk az adatbázisból. A statikus kurzor nem jelent semmilyen INSERT, UPDATE vagy DELETE műveletet (kivéve, ha a kurzort bezárja és újra megnyitja).

Dinamikus kurzorok

A dinamikus kurzorok ellentétesek a statikus kurzorokkal, amelyek lehetővé teszik az adatok frissítési, törlési és beillesztési műveleteit, miközben a kurzor nyitva van. Ez alapértelmezés szerint görgethető . Érzékelheti az eredményhalmaz soraiban, sorrendjében és értékeiben végrehajtott összes változást, függetlenül attól, hogy a változások a kurzoron belül vagy a kurzoron kívül történtek. A kurzoron kívül nem láthatjuk a frissítéseket, amíg nem véglegesítik őket.

Csak előremutató kurzorok

Ez az alapértelmezett és leggyorsabb kurzortípus az összes kurzor közül. Csak előremutató kurzornak nevezik, mert csak előre mozog az eredményhalmazban . Ez a kurzor nem támogatja a görgetést. Csak sorokat tud lekérni az eredményhalmaz elejétől a végéig. Lehetővé teszi beszúrási, frissítési és törlési műveletek végrehajtását. Itt a felhasználó által végrehajtott beszúrási, frissítési és törlési műveletek hatásai láthatók, amelyek az eredménykészlet sorait érintik, amikor a sorokat lekéri a kurzorból. A sor lekérésekor nem láthatjuk a sorokon a kurzoron keresztül végrehajtott módosításokat.

A Csak továbbító kurzorok három kategóriába sorolhatók:

  1. Forward_Only Keyset
  2. Továbbítás_Csak statikus
  3. Előrepörgetés
Kurzor az SQL Serverben

Kulcskészlet által vezérelt kurzorok

Ez a kurzor funkció egy statikus és egy dinamikus kurzor között helyezkedik el változások észlelő képességét illetően. Nem mindig tudja észlelni az eredményhalmaz tagságában és sorrendjében bekövetkezett változásokat, mint egy statikus kurzor. Dinamikus kurzorként képes észlelni az eredményhalmaz sorértékeinek változásait. Csak lehet lépjen az elsőből az utolsóba és az utolsó sorba az első sorba . A kurzor megnyitásakor a sorrend és a tagság rögzítésre kerül.

Egyedi azonosítók készlete működteti, amelyek megegyeznek a kulcskészletben lévő kulcsokkal. A kulcskészletet az összes olyan sor határozza meg, amely a SELECT utasítást minősítette a kurzor első megnyitásakor. Ezenkívül észleli a frissítési és törlési műveleteket támogató adatforrás változásait. Alapértelmezés szerint görgethető.

Példa megvalósítása

Valósítsuk meg a kurzoros példát az SQL szerveren. Ezt úgy tehetjük meg, hogy először létrehozunk egy táblát vevő ' az alábbi állítást használva:

prioritási sor java
 CREATE TABLE customer ( id int PRIMARY KEY, c_name nvarchar(45) NOT NULL, email nvarchar(45) NOT NULL, city nvarchar(25) NOT NULL ); 

Ezután beszúrjuk az értékeket a táblázatba. Az alábbi utasítás végrehajtásával adatokat adhatunk egy táblázathoz:

 INSERT INTO customer (id, c_name, email, city) VALUES (1,'Steffen', '[email protected]', 'Texas'), (2, 'Joseph', '[email protected]', 'Alaska'), (3, 'Peter', '[email protected]', 'California'), (4,'Donald', '[email protected]', 'New York'), (5, 'Kevin', '[email protected]', 'Florida'), (6, 'Marielia', '[email protected]', 'Arizona'), (7,'Antonio', '[email protected]', 'New York'), (8, 'Diego', '[email protected]', 'California'); 

Az adatokat úgy tudjuk ellenőrizni, hogy végrehajtjuk a KIVÁLASZTÁS nyilatkozat:

 SELECT * FROM customer; 

A lekérdezés végrehajtása után az alábbi kimenetet láthatjuk, ahol van nyolc sor a táblázatba:

Kurzor az SQL Serverben

Most létrehozunk egy kurzort az ügyfélrekordok megjelenítéséhez. Az alábbi kódrészletek elmagyarázzák a kurzor deklarációjának vagy létrehozásának minden lépését úgy, hogy mindent összeraknak:

dinamikus tömb java
 --Declare the variables for holding data. DECLARE @id INT, @c_name NVARCHAR(50), @city NVARCHAR(50) --Declare and set counter. DECLARE @Counter INT SET @Counter = 1 --Declare a cursor DECLARE PrintCustomers CURSOR FOR SELECT id, c_name, city FROM customer --Open cursor OPEN PrintCustomers --Fetch the record into the variables. FETCH NEXT FROM PrintCustomers INTO @id, @c_name, @city --LOOP UNTIL RECORDS ARE AVAILABLE. WHILE @@FETCH_STATUS = 0 BEGIN IF @Counter = 1 BEGIN PRINT 'id' + CHAR(9) + 'c_name' + CHAR(9) + CHAR(9) + 'city' PRINT '--------------------------' END --Print the current record PRINT CAST(@id AS NVARCHAR(10)) + CHAR(9) + @c_name + CHAR(9) + CHAR(9) + @city --Increment the counter variable SET @Counter = @Counter + 1 --Fetch the next record into the variables. FETCH NEXT FROM PrintCustomers INTO @id, @c_name, @city END --Close the cursor CLOSE PrintCustomers --Deallocate the cursor DEALLOCATE PrintCustomers 

A kurzor végrehajtása után az alábbi kimenetet kapjuk:

Kurzor az SQL Serverben

Az SQL Server Cursor korlátozásai

A kurzornak vannak bizonyos korlátozásai, így mindig csak akkor szabad használni, ha a kurzoron kívül nincs más opció. Ezek a korlátozások a következők:

  • A kurzor felemészti a hálózati erőforrásokat azáltal, hogy minden rekord lekérésekor hálózati körutazást igényel.
  • A kurzor egy memóriában rezidens mutatókészlet, ami azt jelenti, hogy némi memóriát igényel, amelyet más folyamatok használhatnak a gépünkön.
  • Az adatok feldolgozása során a tábla egy részét vagy a teljes táblát zárolja.
  • A kurzor teljesítménye és sebessége lassabb, mert soronként frissíti a táblázat rekordjait.
  • A kurzorok gyorsabbak, mint a while ciklusok, de több az overheadjük.
  • A kurzorba bevitt sorok és oszlopok száma egy másik szempont, amely befolyásolja a kurzor sebességét. Arra utal, hogy mennyi időbe telik a kurzor megnyitása és a fetch utasítás végrehajtása.

Hogyan kerülhetjük el a kurzorokat?

A kurzorok fő feladata a táblázat soronkénti bejárása. Az alábbiakban bemutatjuk a kurzorok elkerülésének legegyszerűbb módját:

Az SQL while ciklus használata

A kurzor használatának elkerülésének legegyszerűbb módja egy while ciklus, amely lehetővé teszi egy eredménykészlet beillesztését az ideiglenes táblába.

Felhasználó által definiált funkciók

Néha kurzorokat használnak az eredményül kapott sorkészlet kiszámításához. Ezt a követelményeknek megfelelő, felhasználó által definiált függvény használatával érhetjük el.

Csatlakozások használata

A Join csak azokat az oszlopokat dolgozza fel, amelyek megfelelnek a megadott feltételnek, és így csökkenti azokat a kódsorokat, amelyek gyorsabban teljesítenek, mint a kurzorok abban az esetben, ha hatalmas rekordokat kell feldolgozni.