logo

Kursori SQL Serverissä

SQL Serverin kohdistin on d atabase-objekti, jonka avulla voimme noutaa jokaisen rivin kerrallaan ja käsitellä sen tietoja . Kohdistin ei ole muuta kuin osoitin riville. Sitä käytetään aina yhdessä SELECT-käskyn kanssa. Se on yleensä kokoelma SQL logiikka, joka käy läpi ennalta määrätyn määrän rivejä yksitellen. Yksinkertainen esimerkki kursorista on, kun meillä on laaja tietokanta työntekijöiden tietueista ja haluamme laskea jokaisen työntekijän palkan verojen ja lomakkeiden vähentämisen jälkeen.

SQL-palvelin kursorin tarkoitus on päivittää data rivi riviltä, ​​muuttaa sitä tai suorittaa laskutoimituksia, jotka eivät ole mahdollisia, kun haemme kaikki tietueet kerralla . Se on hyödyllinen myös suoritettaessa hallinnollisia tehtäviä, kuten SQL Server -tietokannan varmuuskopioita peräkkäisessä järjestyksessä. Kursoreita käytetään pääasiassa kehitys-, DBA- ja ETL-prosesseissa.

Tämä artikkeli selittää kaiken SQL Server -kursorista, kuten kohdistimen elinkaaren, miksi ja milloin kohdistinta käytetään, kuinka osoittimet otetaan käyttöön, sen rajoitukset ja kuinka voimme korvata kohdistimen.

Kursorin elinkaari

Voimme kuvata kursorin elinkaaren viisi eri osaa seuraavasti:

Kursori SQL Serverissä

1: Ilmoita kohdistin

Ensimmäinen vaihe on määrittää kohdistin käyttämällä alla olevaa SQL-lausetta:

kuinka estää youtube-mainokset Androidissa
 DECLARE cursor_name CURSOR FOR select_statement; 

Voimme ilmoittaa kohdistimen määrittämällä sen nimen tietotyypillä CURSOR avainsanan DECLARE jälkeen. Sitten kirjoitamme SELECT-lauseen, joka määrittää kursorin lähdön.

2: Avaa kohdistin

Se on toinen vaihe, jossa avaamme kohdistimen tulosjoukosta haettujen tietojen tallentamiseksi. Voimme tehdä tämän käyttämällä alla olevaa SQL-lausetta:

 OPEN cursor_name; 

3: Hae kohdistin

Se on kolmas vaihe, jossa rivit voidaan hakea yksitellen tai lohkossa tietojen käsittelyä, kuten lisäys-, päivitys- ja poistotoimintoja varten kohdistimen aktiivisella rivillä. Voimme tehdä tämän käyttämällä alla olevaa SQL-lausetta:

 FETCH NEXT FROM cursor INTO variable_list; 

Voimme myös käyttää @@FETCHSTATUS-toiminto SQL Serverissä saadaksesi viimeisimmän kohdistinta vasten suoritetun FETCH-käskykohdistimen tilan. The FETCH lauseke onnistui, kun @@FETCHSTATUS antaa nollan tulosteen. The SILLÄ AIKAA lauseketta voidaan käyttää kaikkien tietueiden hakemiseen kursorista. Seuraava koodi selittää sen selkeämmin:

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

4: Sulje kohdistin

Se on neljäs vaihe, jossa kohdistin tulee sulkea, kun olemme lopettaneet työskentelyn kohdistimen kanssa. Voimme tehdä tämän käyttämällä alla olevaa SQL-lausetta:

 CLOSE cursor_name; 

5: Pura kohdistin

Se on viides ja viimeinen vaihe, jossa poistamme kohdistimen määritelmän ja vapautamme kaikki kursoriin liittyvät järjestelmäresurssit. Voimme tehdä tämän käyttämällä alla olevaa SQL-lausetta:

 DEALLOCATE cursor_name; 

SQL Server Cursorin käyttötarkoitukset

Tiedämme, että relaatiotietokannan hallintajärjestelmät, mukaan lukien SQL Server, ovat erinomaisia ​​datan käsittelyssä rivillä, jota kutsutaan tulosjoukoksi. Esimerkiksi , meillä on pöytä tuote_taulukko joka sisältää tuotekuvaukset. Jos haluamme päivittää hinta tuotteesta, sitten alla oleva ' PÄIVITTÄÄ' kysely päivittää kaikki tietueet, jotka vastaavat ehtoa MISSÄ' lauseke:

 UPDATE product_table SET unit_price = 100 WHERE product_id = 105; 

Joskus sovelluksen on käsiteltävä rivit yksittäin, eli rivi kerrallaan eikä koko tulosjoukko kerralla. Voimme tehdä tämän prosessin käyttämällä kohdistimia SQL Serverissä. Ennen kuin käytät kohdistinta, meidän on tiedettävä, että osoittimet ovat erittäin huonoja, joten sitä tulisi aina käyttää vain silloin, kun kohdistimen lisäksi ei ole muuta vaihtoehtoa.

Kohdistin käyttää samaa tekniikkaa kuin käytämme silmukoita, kuten FOREACH, FOR, WHILE, DO WHILE iteroidaksemme yhtä objektia kerrallaan kaikilla ohjelmointikielillä. Siksi se voidaan valita, koska se soveltaa samaa logiikkaa kuin ohjelmointikielen silmukkaprosessi.

Kohdistinten tyypit SQL Serverissä

Seuraavassa on lueteltu alla erityyppiset kohdistimet SQL Serverissä:

  • Staattiset kursorit
  • Dynaamiset osoittimet
  • Vain eteenpäin suuntaavat osoittimet
  • Keyset Kursorit
Kursori SQL Serverissä

Staattiset kursorit

Staattisen kursorin näyttämä tulosjoukko on aina sama kuin kohdistin avattaessa ensimmäistä kertaa. Koska staattinen kursori tallentaa tuloksen tempdb , ne ovat aina Lue ainoastaan . Voimme käyttää staattista kohdistinta liikkuaksesi sekä eteen- että taaksepäin. Toisin kuin muut kursorit, se on hitaampi ja kuluttaa enemmän muistia. Tästä syystä voimme käyttää sitä vain silloin, kun vierittäminen on välttämätöntä, eivätkä muut kohdistimet ole sopivia.

Tämä kohdistin näyttää rivit, jotka poistettiin tietokannasta sen avaamisen jälkeen. Staattinen kohdistin ei edusta mitään INSERT-, UPDATE- tai DELETE-toimintoja (ellei kohdistinta suljeta ja avata uudelleen).

len of merkkijono javassa

Dynaamiset osoittimet

Dynaamiset osoittimet ovat vastapäätä staattisia osoittimia, joiden avulla voimme suorittaa tietojen päivitys-, poisto- ja lisäystoiminnot kohdistimen ollessa auki. se on oletuksena vieritettävä . Se voi havaita kaikki tulosjoukon riveihin, järjestykseen ja arvoihin tehdyt muutokset riippumatta siitä, tapahtuvatko muutokset kohdistimen sisällä vai sen ulkopuolella. Kohdistimen ulkopuolella emme näe päivityksiä ennen kuin ne on vahvistettu.

Vain eteenpäin suuntaavat osoittimet

Se on oletusarvoinen ja nopein kohdistintyyppi kaikkien kohdistimien joukossa. Sitä kutsutaan vain eteenpäin suuntautuvaksi kursoriksi, koska se siirtyy vain eteenpäin tulosjoukon läpi . Tämä kohdistin ei tue vieritystä. Se voi hakea vain rivejä tulosjoukon alusta loppuun. Sen avulla voimme suorittaa lisäys-, päivitys- ja poistotoimintoja. Tässä näkyy käyttäjän tekemien lisäys-, päivitys- ja poistotoimintojen vaikutus, jotka vaikuttavat tulosjoukon riveihin, kun rivit noudetaan kursorista. Kun rivi haettiin, emme näe kohdistimen kautta riveihin tehtyjä muutoksia.

Vain eteenpäin suuntaavat kohdistimet on jaettu kolmeen tyyppiin:

  1. Forward_Only Keyset
  2. Eteenpäin_Vain staattinen
  3. Fast_Forward
Kursori SQL Serverissä

Keyset-ohjatut osoittimet

Tämä kohdistimen toiminto on staattisen ja dynaamisen kohdistimen välissä sen kyvystä havaita muutoksia. Se ei aina pysty havaitsemaan muutoksia tulosjoukon jäsenyydessä ja järjestyksessä kuin staattinen kursori. Se voi havaita muutokset tulosjoukon riviarvoissa kuin dynaaminen kohdistin. Se voi vain siirtyä ensimmäisestä viimeiseen ja viimeisestä ensimmäiselle riville . Järjestys ja jäsenyys vahvistetaan aina, kun tämä kursori avataan.

Sitä käytetään joukolla yksilöllisiä tunnisteita, jotka ovat samat kuin avainsarjan avaimet. Avainjoukon määrittävät kaikki rivit, jotka hyväksyivät SELECT-käskyn, kun kohdistin avattiin ensimmäisen kerran. Se voi myös havaita muutokset tietolähteeseen, joka tukee päivitys- ja poistotoimintoja. Se on oletuksena vieritettävä.

Esimerkin toteutus

Toteutetaan kursoriesimerkki SQL-palvelimeen. Voimme tehdä tämän luomalla ensin taulukon nimeltä asiakas ' käyttämällä alla olevaa lausetta:

 CREATE TABLE customer ( id int PRIMARY KEY, c_name nvarchar(45) NOT NULL, email nvarchar(45) NOT NULL, city nvarchar(25) NOT NULL ); 

Seuraavaksi lisäämme arvot taulukkoon. Voimme suorittaa alla olevan käskyn lisätäksesi tietoja taulukkoon:

 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'); 

Voimme tarkistaa tiedot suorittamalla VALITSE lausunto:

 SELECT * FROM customer; 

Kun kysely on suoritettu, voimme nähdä alla olevan lähdön missä meillä on kahdeksan riviä pöytään:

Kursori SQL Serverissä

Nyt luomme kohdistimen asiakastietueiden näyttämiseksi. Alla olevat koodinpätkät selittävät kaikki kohdistimen määrityksen tai luomisen vaiheet yhdistämällä kaikki:

java päivämäärä merkkijonoon
 --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 

Kohdistimen suorittamisen jälkeen saamme seuraavan tuloksen:

Kursori SQL Serverissä

SQL Server Cursorin rajoitukset

Kohdistimella on joitain rajoituksia, joten sitä tulisi aina käyttää vain silloin, kun kohdistimen lisäksi ei ole muuta vaihtoehtoa. Nämä rajoitukset ovat:

  • Kursori kuluttaa verkkoresursseja vaatimalla verkon edestakaisen matkan joka kerta, kun se hakee tietueen.
  • Kohdistin on muistissa oleva osoittimien joukko, mikä tarkoittaa, että se vie jonkin verran muistia, jota muut prosessit voisivat käyttää koneellamme.
  • Se asettaa lukot taulukon osaan tai koko taulukkoon tietojen käsittelyn aikana.
  • Kohdistimen suorituskyky ja nopeus ovat hitaampia, koska ne päivittävät taulukon tietueita rivi kerrallaan.
  • Kohdistimet ovat nopeampia kuin while-silmukat, mutta niillä on enemmän ylärajaa.
  • Kohdistimeen tuotujen rivien ja sarakkeiden määrä on toinen seikka, joka vaikuttaa kohdistimen nopeuteen. Se viittaa siihen, kuinka paljon aikaa kuluu kursorin avaamiseen ja hakulausekkeen suorittamiseen.

Kuinka voimme välttää kursoreita?

Kursoreiden päätehtävä on kulkea taulukon läpi rivi riviltä. Helpoin tapa välttää kohdistimet on annettu alla:

SQL:n while-silmukan käyttö

Helpoin tapa välttää kursorin käyttö on käyttää while-silmukkaa, joka mahdollistaa tulosjoukon lisäämisen väliaikaiseen taulukkoon.

Käyttäjän määrittämät toiminnot

Joskus kursoreita käytetään tuloksena olevan rivijoukon laskemiseen. Voimme saavuttaa tämän käyttämällä käyttäjän määrittämää toimintoa, joka täyttää vaatimukset.

Liitosten käyttäminen

Join käsittelee vain ne sarakkeet, jotka täyttävät määritetyn ehdon ja vähentää siten koodirivejä, jotka antavat nopeamman suorituskyvyn kuin kursorit, jos suuria tietueita on käsiteltävä.