SQLShack (Magyar)

Az SQL Server kurzorok az Internet egyik általános témája . Különböző véleményeket talál, amikor használni kell őket, és mikor nem. Ma beszélünk róluk és megválaszoljuk a kérdést, hogy mikor (ne) használjuk őket.

Az adatmodell és az általános ötlet

Az előző cikkben Bevezetés az SQL-be Szerver hurkok, beszéltünk az SQL Server hurkokról, de az adatbázisból származó adatokat nem használtuk fel. Ez furcsa volt, de ennek most sokkal világosabbá kell válnia. Ma, miközben elmagyarázzuk a kurzorokat, az adatbázis adatait felhasználjuk arra, hogy megmutassuk, mikor (nem) használjuk a kurzorokat. Az általunk használt adatmodell ugyanaz, amelyet ebben a sorozatban használunk.

Az SQL Server 3 a kurzorok különböző megvalósításai – Transact-SQL kurzorok, API kurzorok és kliens kurzorok. Ebben a cikkben a Transact-SQL kurzorokra fogunk koncentrálni. Könnyen felismeri őket, mert a DECLARE CURSOR szintaxison alapulnak.

SQL Server kurzor – Bevezetés

Mielőtt áttérnénk a kódra és a példákra, meg kell magyaráznunk az SQL Server kurzorait vannak.

Az SQL Server kurzor T-SQL logika, amely lehetővé teszi számunkra, hogy végigvigyen a kapcsolódó lekérdezés eredményén. Ez lehetővé teszi számunkra a műveletek egymást követő végrehajtását – például egy sor frissítését.

Ez néha hasznosnak tűnhet (de látszólag), de ha adatbázisokkal dolgozik, akkor ne használjon eljárási programozási mintákat. inkább ragaszkodjon a deklaratív programozáshoz. Az egyik fő ok az, hogy a DBMS-ek már optimalizáltak az adatsorok műveleteinek végrehajtására, és ezért nem Önnek kellene lennie annak, aki “okosabb a rendszernél”.

Ennek ellenére jó hogy tudjam, hogyan működnek. Ha más nem, akkor talán találkozol velük az örökölt kódban, és újra kell írnod a logikát. És mielőtt bármit megtennél, meg kell értened, hogy működik.

Tehát, ha kurzorokra van szüksége, akkor erről tudnia kell rájuk:

  • A kurzorok a változók segítségével tárolják a hurok minden részében visszaküldött értékeket. Ezért DEKLARÁLNI kell minden szükséges változó
  • A következő tennivaló a DECLARE … CURSOR FOR SELECT lekérdezés, ahol deklarálnia kell egy kurzort, és meg kell határoznia a kurzorral (feltöltésével) kapcsolatos lekérdezést is.
  • Megnyitja a kurzort és a FETCH NEXT-t a kurzorból.
  • A WHILE ciklusban teszteli a @@ FETCH_STATUS változót (WHILE @@ FETCH_STATUS = 0). Ha a feltétel teljesül, akkor belépek a BEGIN ciklusba … END blokkolja, és utasításokat hajtson végre a blokk belsejében
  • Miután végignézte a teljes eredménykészletet, kilép a ciklusból. Zárja be a kurzort, és távolítsa el. Az elosztás azért fontos, mert ez törli a kurzor definícióját és felszabadítja a felhasznált memóriát.

SQL Server kurzor – Példák

Most nézzünk meg két kurzor példát. Bár meglehetősen egyszerűek, szépen elmagyarázzák a kurzorok működését.

Az első példában meg akarjuk kapni az összes város azonosítóját és nevét, a hozzájuk kapcsolódó országnevekkel együtt. A PRINT paranccsal kombinációkat nyomtatunk a ciklus minden egyes lépésében.

Az SQL Server kurzor és a míg a ciklus pontosan azt adta vissza, amire számítottunk – az összes város és a kapcsolódó országok azonosítói és nevei, az adatbázisban vannak. a kurzor DECLARE részében tárolt eredeti SQL lekérdezést használva, így nem volt szükség kurzorra.

Megyünk még egy példával. Ezúttal megkérdezzük az információs séma adatbázisát, hogy az első 5 táblázatot a táblázat neve szerint rendezzük vissza. Bár nincs sok értelme egy ilyen lekérdezésnek, ez a példa megmutatja:

  • Hogyan kérdezzünk le az információséma adatbázisról
  • Hogyan kombinálhatunk néhány parancsot / utasítást, már említettük a korábbi cikkekben (HA… EGYÉB, WHILE ciklus, CONCAT)

A kódolási oldalról, Szeretném hangsúlyozni, hogy ezúttal nem nyomtattunk ciklusban semmit, hanem a CONCAT segítségével hoztunk létre egy karakterláncot. Ezenkívül az IF utasítást használtuk annak tesztelésére, hogy az első lépésben vagyunk-e, és ha igen, akkor nem adtunk hozzá “,”. Ellenkező esetben hozzáadnánk a “” karakterláncot.

A ciklus után kinyomtattuk az eredmény karakterláncát, bezártuk és lefoglaltuk a kurzort.

Ezt a STRING_AGG függvény segítségével érhetnénk el. Ez az SQL Server 2017-től kezdődően érhető el, és egyenértékű a MySQL GROUP_CONCAT függvénnyel.

SQL Server kurzor – mikor (nem) használja őket?

Megpróbálom adjon objektív választ arra a kérdésre, hogy “mikor kell használni az SQL Server kurzorokat, és mikor nem”? Mivel a dolgok az idő folyamán változnak, és javításokat kell végrehajtani, vagy a kurzorokon, vagy más objektumokon, amelyek “helyettesítik” őket, vegyék figyelembe a cikk írásának dátuma.Tehát kezdjük.

Ne használjon kurzort:

  • Szinte mindig 🙂 Ez hülyén hangozhat, de ez a legtöbb esetben igaz. Az SQL Server nagyszámú objektum & funkciót valósít meg, amelyek pontosan azt teszik, amit valószínűleg megpróbálna megoldani a kurzorok segítségével. Mielőtt úgy döntene, hogy a kurzorral megy, győződjön meg róla, hogy eléggé megvizsgálta, hogy megállapítsa, hogy a kurzor az egyetlen lehetséges (jó) megoldás. Ugyanez az adatbázisok hurkait jelenti. Az előző cikkben – Bevezetés az SQL Server-hurkokba – hurkokat használtunk, de nem az adatok hurkolására.

Használhat kurzorokat:

  • Többnyire adatbázis-adminisztrációs feladatokhoz, például biztonsági mentésekhez, integritás-ellenőrzésekhez, indexek újjáépítéséhez
  • egyszeri használatra feladatokat, ha biztos abban, hogy az esetleges gyenge teljesítmény nem befolyásolja a rendszer teljes teljesítményét.
  • Tárolt eljárás néhány alkalommal történő meghívása különböző paraméterek használatával. Ebben az esetben a kurzorváltozóktól kapna paramétereket, és hívásokat kezdeményezne a hurok belsejében.

    Tárolt eljárás vagy egy másik lekérdezés meghívása a kurzor (vagy hurok) belsejében nagyban befolyásolja a teljesítményt, mert a kurzor hurok, a kezdetektől futtatja a lekérdezést / eljárást. Ha úgy dönt, hogy ezt megteszi, akkor tisztában kell lennie a lehetséges következményekkel.

  • Az előző tipp eljuttat minket az utolsó pontig, amikor kurzorokat kell használni. Ha teljesen tisztában van a működésükkel, és biztos benne, hogy ez nem befolyásolja a teljesítményt, akkor hajtsa végre

SQL Server kurzor – Miért használják az emberek (nem) ?

Az utolsó kérdésre szeretnék válaszolni: Miért használna valaki kurzort? Így látom:

  • Azoknak az embereknek van mentségük, akik egyszeri munkákhoz vagy rendszeres tevékenységekhez használják őket, ahol nem befolyásolják a teljesítményt. Ennek egyik oka az, hogy az ilyen kód eljárási kód, és ha hozzá van szokva, akkor nagyon olvasható.
  • Másrészt azok, akik elkezdték megismerni az adatbázisokat, és megszokták az eljárási programozást használjon kurzorokat, mert mint említettük, sokkal közelebb vannak az eljárásprogramozáshoz, mint az adatbázisokhoz. Ez nem ok arra, hogy felhasználjuk őket, mert az egyetlen mentség az lenne, hogy egyszerűen nem tudná a másik (helyes) módját a dolgok végrehajtásának.
  • A kurzoroknál az a legfontosabb, hogy azok lassúak az SQL utasításokhoz képest, ezért kerülje azok használatát, mert előbb-utóbb teljesítményproblémákhoz vezetnek (hacsak nem tudod pontosan, hogy mit és miért csinálsz)

I hasznosnak találja, ha megérti a kurzor fogalmát, mert nagy esély van rá, és útközben találkozni fog velük. Népszerűek voltak, mielőtt új lehetőségeket adtak volna az SQL Serverhez. Valószínűleg folytatja a munkát egy olyan rendszeren, ahol valaki használta őket, és ott kell folytatnia, ahol abbahagyta. Lehet, hogy le kell cserélnie a kurzort (eljárási kód) SQL-re (deklaratív kód).

Következtetés

Nincs jobb következtetés a kurzorokról, mint – ne használja őket 🙂 Az SQL Server sok olyan módosítást hajtott végre, amelyek megoldják azokat a problémákat, amelyeket korábban deklaratív kód használatával nehéz volt megoldani. Inkább töltsön el egy kis időt egy új dolog vizsgálatával és tanulásával, végül pedig az optimális kód előállításával. Természetesen használhatja őket, ha tudja, miért teszi ezt, és tisztában van a velük kapcsolatos lehetséges problémákkal.

Tartalomjegyzék

Tanuljon SQL : DATABÁZIS LÉTREHOZÁSA & TABLE műveletek létrehozása

Az SQL elsajátítása: INSERT INTO TABLE

Az SQL megismerése: Elsődleges kulcs

Ismerje meg az SQL-t: idegen kulcs

Tanulja meg az SQL: SELECT utasítást

Tanulja meg az SQL-t: INNER JOIN vs LEFT JOIN

Ismerje meg az SQL-t: SQL parancsfájlok

Ismerje meg az SQL-t: A kapcsolatok típusai

Az SQL megtanulása: Több táblázat összekapcsolása

Ismerje meg az SQL-t: összesített függvények

Ismerje meg az SQL-t: Hogyan kell írni egy komplex SELECT lekérdezést?

Ismerje meg az SQL-t: Az INFORMATION_SCHEMA adatbázis

Ismerje meg az SQL-t: SQL adattípusok

Ismerje meg az SQL-t: Állítsa be az elméletet

Ismerje meg az SQL-t: Felhasználó által definiált függvények

Ismerje meg az SQL-t: Felhasználó által meghatározott tárolt eljárások

Ismerje meg az SQL-t: SQL-nézetek

Ismerje meg az SQL-t: SQL-triggerek

Ismerje meg az SQL-t: Gyakorolja az SQL-lekérdezéseket

Ismerje meg az SQL-t: SQL-lekérdezések példái

Ismerje meg az SQL-t: Hozzon létre jelentést manuálisan SQL-lekérdezések segítségével

Tanulja meg az SQL-t: SQL Server dátum és idő függvények

Ismerje meg az SQL-t: Hozzon létre SQL Server-jelentéseket dátum- és időfüggvények használata

Ismerje meg az SQL-t: SQL Server pivot-táblák

Ismerje meg az SQL-t: SQL Server-exportálás Excelbe

Ismerje meg az SQL-t: Bevezetés az SQL Server-ciklusokba

Ismerje meg az SQL-t: SQL Server-kurzorok

Ismerje meg az SQL-t: Az SQL legjobb gyakorlata az adatok törléséhez és frissítéséhez

Ismerje meg az SQL-t: Elnevezési konvenciók

Ismerje meg az SQL-t: SQL-hez kapcsolódó munkák

Ismerje meg az SQL-t: Non-Equi csatlakozik az SQL Server-hez

Ismerje meg az SQL-t: SQL injekció

  • Szerző
  • Legutóbbi bejegyzések
Emil egy adatbázis-szakember több mint 10 éves tapasztalattal rendelkezik az adatbázisokkal kapcsolatban. Az évek során az informatikai és pénzügyi iparban dolgozott, és most szabadúszóként dolgozik.
Korábbi és jelenlegi feladatai az adatbázis-tervezéstől és a kódolástól az oktatásig, tanácsadásig és az adatbázisokról szóló írásig változnak. Ne feledkezzünk meg a BI-ről sem, algoritmusok, sakk, filatélia, 2 kutya, 2 macska, 1 feleség, 1 baba …
Megtalálhatja őt a LinkedIn oldalon
Druskic Emil összes bejegyzésének megtekintése

Drkusic Emil legújabb üzenetei (az összes megtekintése)
  • Tanuljon SQL: SQL Injection – 2020. november 2.
  • Tanuljon SQL: Non-Equi csatlakozik az SQL Serverhez – 2020. szeptember 29.
  • Tanuljon SQL-t: SQL-hez kapcsolódó munkák – 2020. szeptember 1.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük