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
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
- 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.