Kurzor v SQL Server je d objekt atabase, ktorý nám umožňuje načítať každý riadok naraz a manipulovať s jeho údajmi . Kurzor nie je nič iné ako ukazovateľ na riadok. Vždy sa používa v spojení s príkazom SELECT. Zvyčajne ide o zbierku SQL logika, ktorá prechádza cez vopred určený počet riadkov jeden po druhom. Jednoduchá ilustrácia kurzora je, keď máme rozsiahlu databázu záznamov pracovníkov a chceme vypočítať mzdu každého pracovníka po odpočítaní daní a dovoleniek.
Server SQL Účel kurzora je aktualizovať údaje riadok po riadku, meniť ich alebo vykonávať výpočty, ktoré nie sú možné, keď získavame všetky záznamy naraz . Je tiež užitočný pri vykonávaní administratívnych úloh, ako je napríklad zálohovanie databázy SQL Server v sekvenčnom poradí. Kurzory sa používajú hlavne vo vývoji, DBA a ETL procesoch.
Tento článok vysvetľuje všetko o kurzore SQL Server, ako je životný cyklus kurzora, prečo a kedy sa kurzor používa, ako implementovať kurzory, jeho obmedzenia a ako môžeme nahradiť kurzor.
Životný cyklus kurzora
Životný cyklus kurzora môžeme opísať do päť rôznych sekcií nasledovne:
1: Deklarovať kurzor
Prvým krokom je deklarovať kurzor pomocou nižšie uvedeného príkazu SQL:
rozdiel tiger lev
DECLARE cursor_name CURSOR FOR select_statement;
Kurzor môžeme deklarovať zadaním jeho názvu s dátovým typom CURSOR za kľúčovým slovom DECLARE. Potom napíšeme príkaz SELECT, ktorý definuje výstup pre kurzor.
2: Otvorte kurzor
Je to druhý krok, v ktorom otvoríme kurzor na uloženie údajov získaných zo sady výsledkov. Môžeme to urobiť pomocou nižšie uvedeného príkazu SQL:
OPEN cursor_name;
3: Načítať kurzor
Je to tretí krok, v ktorom je možné načítať riadky jeden po druhom alebo v bloku na manipuláciu s údajmi, ako sú operácie vloženia, aktualizácie a vymazania v aktuálne aktívnom riadku kurzora. Môžeme to urobiť pomocou nižšie uvedeného príkazu SQL:
FETCH NEXT FROM cursor INTO variable_list;
Môžeme tiež použiť Funkcia @@FETCHSTATUS v SQL Server, aby ste získali stav posledného kurzora príkazu FETCH, ktorý bol vykonaný oproti kurzoru. The FETCH príkaz bol úspešný, keď @@FETCHSTATUS dáva nulový výstup. The WHILE príkaz možno použiť na získanie všetkých záznamov z kurzora. Nasledujúci kód to vysvetľuje jasnejšie:
WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM cursor_name; END;
4: Zatvorte kurzor
Je to štvrtý krok, v ktorom by mal byť kurzor zatvorený po ukončení práce s kurzorom. Môžeme to urobiť pomocou nižšie uvedeného príkazu SQL:
CLOSE cursor_name;
5: Prideliť kurzor
Je to piaty a posledný krok, v ktorom vymažeme definíciu kurzora a uvoľníme všetky systémové prostriedky spojené s kurzorom. Môžeme to urobiť pomocou nižšie uvedeného príkazu SQL:
DEALLOCATE cursor_name;
Použitie SQL Server Cursor
Vieme, že systémy na správu relačných databáz, vrátane SQL Servera, sú vynikajúce pri spracovávaní údajov na množine riadkov nazývaných množiny výsledkov. Napríklad , máme stôl product_table ktorý obsahuje popis produktov. Ak chceme aktualizovať cena produktu, potom nižšie uvedené „ AKTUALIZOVAŤ' dotaz aktualizuje všetky záznamy, ktoré zodpovedajú podmienke v ' KDE' klauzula:
UPDATE product_table SET unit_price = 100 WHERE product_id = 105;
Aplikácia niekedy potrebuje spracovať riadky jednorazovým spôsobom, t. j. riadok po riadku a nie celú sadu výsledkov naraz. Tento proces môžeme vykonať pomocou kurzorov na serveri SQL Server. Pred použitím kurzora musíme vedieť, že kurzory majú veľmi zlý výkon, takže by sa mal vždy používať iba vtedy, keď neexistuje žiadna možnosť okrem kurzora.
Kurzor používa rovnakú techniku ako my používame slučky ako FOREACH, FOR, WHILE, DO WHILE na iteráciu jedného objektu naraz vo všetkých programovacích jazykoch. Preto by sa mohol vybrať, pretože používa rovnakú logiku ako proces slučkovania programovacieho jazyka.
Typy kurzorov v SQL Server
Nižšie sú uvedené rôzne typy kurzorov na serveri SQL Server:
- Statické kurzory
- Dynamické kurzory
- Kurzory iba vpred
- Kurzory sady kľúčov
Statické kurzory
Sada výsledkov zobrazená statickým kurzorom je vždy rovnaká ako pri prvom otvorení kurzora. Pretože statický kurzor uloží výsledok do tempdb , sú vždy iba na čítanie . Na pohyb dopredu aj dozadu môžeme použiť statický kurzor. Na rozdiel od iných kurzorov je pomalší a spotrebuje viac pamäte. V dôsledku toho ho môžeme použiť len vtedy, keď je potrebné rolovanie a iné kurzory nie sú vhodné.
Tento kurzor zobrazuje riadky, ktoré boli z databázy odstránené po jej otvorení. Statický kurzor nepredstavuje žiadne operácie INSERT, UPDATE alebo DELETE (pokiaľ nie je kurzor zatvorený a znovu otvorený).
Dynamické kurzory
Dynamické kurzory sú oproti statickým kurzorom, ktoré nám umožňujú vykonávať operácie aktualizácie, vymazávania a vkladania údajov, keď je kurzor otvorený. to je predvolene posúvateľný . Dokáže zistiť všetky zmeny vykonané v riadkoch, poradí a hodnotách v sade výsledkov, či už sa zmeny vyskytnú vo vnútri kurzora alebo mimo neho. Mimo kurzora nevidíme aktualizácie, kým nie sú potvrdené.
Kurzory iba vpred
Je to predvolený a najrýchlejší typ kurzora spomedzi všetkých kurzorov. Nazýva sa kurzorom iba vpred, pretože sa posúva iba dopredu cez sadu výsledkov . Tento kurzor nepodporuje rolovanie. Môže načítať iba riadky od začiatku do konca sady výsledkov. Umožňuje nám vykonávať operácie vkladania, aktualizácie a odstraňovania. Tu je efekt operácií vloženia, aktualizácie a vymazania vykonaných používateľom, ktoré ovplyvňujú riadky v sade výsledkov, viditeľný, keď sú riadky načítané z kurzora. Keď bol riadok načítaný, cez kurzor nevidíme zmeny vykonané v riadkoch.
Kurzory typu Forward-Only sú tri kategorizované do troch typov:
- Forward_Only Keyset
- Forward_Only Static
- Rýchlo vpred
Kurzory riadené súpravou klávesov
Táto funkcia kurzora leží medzi statickým a dynamickým kurzorom pokiaľ ide o jeho schopnosť odhaliť zmeny. Nemôže vždy zistiť zmeny v členstve a poradí sady výsledkov ako statický kurzor. Dokáže detekovať zmeny v hodnotách riadkov sady výsledkov ako dynamický kurzor. Môže len presunúť z prvého do posledného a posledného do prvého radu . Objednávka a členstvo sa zafixujú pri každom otvorení tohto kurzora.
Ovláda sa pomocou sady jedinečných identifikátorov rovnakých ako kľúče v súprave kľúčov. Sada kľúčov je určená všetkými riadkami, ktoré kvalifikovali príkaz SELECT pri prvom otvorení kurzora. Dokáže tiež zistiť akékoľvek zmeny v zdroji údajov, ktorý podporuje operácie aktualizácie a vymazania. V predvolenom nastavení je rolovateľný.
Implementácia príkladu
Implementujme príklad kurzora na SQL serveri. Môžeme to urobiť tak, že najprv vytvoríme tabuľku s názvom ' zákazníka “ pomocou nižšie uvedeného vyhlásenia:
pd.merge
CREATE TABLE customer ( id int PRIMARY KEY, c_name nvarchar(45) NOT NULL, email nvarchar(45) NOT NULL, city nvarchar(25) NOT NULL );
Ďalej do tabuľky vložíme hodnoty. Na pridanie údajov do tabuľky môžeme vykonať nasledujúci príkaz:
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');
Údaje môžeme overiť vykonaním SELECT vyhlásenie:
SELECT * FROM customer;
Po vykonaní dotazu môžeme vidieť nižšie uvedený výstup tam, kde ho máme osem riadkov do tabuľky:
Teraz vytvoríme kurzor na zobrazenie záznamov zákazníkov. Nižšie uvedené úryvky kódu vysvetľujú všetky kroky deklarácie alebo vytvorenia kurzora tým, že všetko spoja:
Herečka Sai Pallavi
--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
Po vykonaní kurzora dostaneme nasledujúci výstup:
Obmedzenia SQL Server Cursor
Kurzor má určité obmedzenia, takže by sa mal vždy používať iba vtedy, keď neexistuje žiadna možnosť okrem kurzora. Tieto obmedzenia sú:
- Kurzor spotrebováva sieťové zdroje tým, že vyžaduje spiatočnú sieť vždy, keď načíta záznam.
- Kurzor je množina ukazovateľov rezidentných v pamäti, čo znamená, že zaberá určitú pamäť, ktorú by na našom počítači mohli použiť iné procesy.
- Pri spracovaní údajov zablokuje časť tabuľky alebo celú tabuľku.
- Výkon a rýchlosť kurzora sú pomalšie, pretože aktualizujú záznamy tabuľky po jednom riadku.
- Kurzory sú rýchlejšie ako slučky while, ale majú väčšiu réžiu.
- Počet riadkov a stĺpcov prenesených do kurzora je ďalším aspektom, ktorý ovplyvňuje rýchlosť kurzora. Vzťahuje sa na to, koľko času trvá otvorenie kurzora a vykonanie príkazu načítania.
Ako sa môžeme vyhnúť kurzorom?
Hlavnou úlohou kurzorov je prechádzať tabuľkou riadok po riadku. Najjednoduchší spôsob, ako sa vyhnúť kurzorom, je uvedený nižšie:
Použitie slučky SQL while
Najjednoduchší spôsob, ako sa vyhnúť použitiu kurzora, je použiť cyklus while, ktorý umožňuje vloženie sady výsledkov do dočasnej tabuľky.
Používateľom definované funkcie
Niekedy sa na výpočet výslednej sady riadkov používajú kurzory. Môžeme to dosiahnuť použitím užívateľom definovanej funkcie, ktorá spĺňa požiadavky.
Pomocou spojenia
Join spracuje iba tie stĺpce, ktoré spĺňajú zadanú podmienku, a tým zníži počet riadkov kódu, ktoré poskytujú rýchlejší výkon ako kurzory v prípade, že je potrebné spracovať veľké záznamy.