SQLShack (Čeština)
Kurzy serveru SQL Server jsou jedním běžným tématem na internetu . Najdete různé názory, kdy je použít a kdy ne. Dnes si o nich také povíme a odpovíme na otázku, kdy je (ne) použít.
Datový model a obecná myšlenka
V předchozím článku Úvod do SQL Smyčky serveru, hovořili jsme o smyčkách serveru SQL, ale nepoužili jsme data z databáze. To bylo zvláštní, ale teď by to mělo být mnohem jasnější. Dnes, když vysvětlujeme kurzory, použijeme data z databáze, abychom ukázali, kdy (ne) použít kurzory. Datový model, který budeme používat, je stejný, jaký používáme v této sérii.
SQL Server podporuje 3 různé implementace kurzorů – kurzory Transact-SQL, kurzory API a klientské kurzory. V tomto článku se zaměříme na kurzory Transact-SQL. Snadno je poznáte, protože jsou založeny na syntaxi DECLARE CURSOR.
Kurz serveru SQL – Úvod
Než přejdeme ke kódu a příkladům, měli bychom vysvětlit, jaké kurzory serveru SQL Server are.
Kurzor serveru SQL je logika T-SQL, která nám umožňuje procházet souvisejícím výsledkem dotazu. To nám umožňuje provádět akce postupně – např. Provést aktualizaci na jednom řádku.
Někdy to může (zdá se) být užitečné, ale při práci s databázemi byste neměli používat procedurální programovací vzory ale spíše se držte deklarativního programování. Jedním z hlavních důvodů je to, že DBMS jsou již optimalizovány k provádění akcí se soubory dat, a proto byste neměli být tím, kdo se snaží být „chytřejší než systém“.
Přesto je to dobré abyste věděli, jak fungují. Pokud nic jiného, možná se s nimi setkáte v kódu, který zdědíte, a budete muset přepsat logiku. A než něco uděláte, měli byste pochopit, jak to funguje.
Takže v případě, že potřebujete kurzory, měli byste o nich vědět:
- Kurzory používají proměnné k ukládání hodnot vrácených v každé části smyčky. Proto budete muset VYHLEDAT všechny proměnné, které budete potřebovat
- Další věcí, kterou musíte udělat, je DECLARE … CURSOR FOR SELECT dotazu, kde deklarujete kurzor a také definujete dotaz související s (vyplněním) daného kurzoru
- OTEVŘETE kurzor a FETCH NEXT z kurzoru
- Ve smyčce WHILE otestujete proměnnou @@ FETCH_STATUS (WHILE @@ FETCH_STATUS = 0). Pokud podmínka platí, můžete Začnu do smyčky … UKONČIT blokování a provádění příkazů uvnitř tohoto bloku
- Poté, co projdete celou sadu výsledků, opustíte smyčku. Měli byste zavřít kurzor a ODLOŽIT jej. Dealokace je důležitá, protože to odstraní definici kurzoru a uvolní použitou paměť.
Kurz serveru SQL Server – příklady
Podívejme se nyní na dva příklady kurzoru. I když jsou velmi jednoduché, pěkně vysvětlují, jak kurzory fungují.
V prvním příkladu chceme získat ID a názvy všech měst spolu s jejich souvisejícími názvy zemí. Příkaz PRINT použijeme k tisku kombinací v každém průchodu smyčky.
Pomocí kurzoru serveru SQL Server a zatímco smyčka vrátila přesně to, co jsme očekávali – ID a názvy všech měst a souvisejících zemí, máme v databázi.
Nejdůležitější věcí, kterou je třeba zmínit, je, že bychom mohli jednoduše vrátit tuto sadu výsledků pomocí původního dotazu SQL uloženého v DECLARE části kurzoru, takže kurzor nebyl potřeba.
Půjdeme s dalším příkladem. Tentokrát zadáme dotaz na databázi informačního schématu, abychom vrátili prvních 5 tabulek seřazených podle názvu tabulky. I když nemá smysl používat takový dotaz, tento příklad vám ukáže:
- Jak dotazovat databázi informačního schématu
- Jak kombinovat několik příkazů / příkazů, které jsme zmínil jsem se v předchozích článcích (IF… ELSE, WHILE loop, CONCAT)
Z kódovací strany, Chtěl bych zdůraznit, že tentokrát jsme nevytiskli nic ve smyčce, ale vytvořili jsme řetězec pomocí CONCAT. Pomocí příkazu IF jsme také otestovali, zda jsme v prvním průchodu, a pokud ano, nepřidali jsme do řetězce řetězec „,“. Jinak bychom do řetězce přidali „,“.
Po smyčce jsme vytiskli výsledný řetězec, zavřeli a uvolnili kurzor.
Toho bychom mohli dosáhnout pomocí funkce STRING_AGG. Tenhle je k dispozici od SQL Serveru 2017 a je ekvivalentem funkce MySQL GROUP_CONCAT.
Kurz SQL Serveru – Kdy (Ne) je použít?
Pokusím se dejte objektivní odpověď na otázku – „Kdy byste měli používat kurzory SQL Serveru a kdy ne“? Protože se věci v průběhu času mění a je třeba provést vylepšení, ať už na kurzorech, nebo na jiných objektech, které je „nahrazují“, vezměte v úvahu datum, kdy byl tento článek napsán.Pojďme tedy začít.
Neměli byste používat kurzory:
- Téměř vždy 🙂 Může to znít hloupě, ale ve většině případů to platí. SQL Server implementuje velké množství objektů & funkcí, které dělají přesně to, co byste se pravděpodobně pokusili vyřešit pomocí kurzorů. Než se rozhodnete použít kurzor, ujistěte se, že jste dostatečně prozkoumali, abyste dospěli k závěru, že kurzor je jediným možným (dobrým) řešením. Totéž znamená smyčky v databázích. V předchozím článku, Úvod do smyček serveru SQL, jsme použili smyčky, ale ne k procházení dat.
Můžete použít kurzory:
- Většinou pro úlohy správy databáze, jako jsou zálohy, kontroly integrity, opětovné sestavení indexů.
- Jednorázově úkoly, když jste si jisti, že případný špatný výkon nebude mít vliv na celkový výkon systému
-
Několikrát volání uložené procedury pomocí různých parametrů. V takovém případě byste dostali parametry z proměnných kurzoru a uskutečňovali volání uvnitř smyčky.
Volání uložené procedury nebo jiného dotazu uvnitř kurzoru (nebo smyčky) hodně ovlivňuje výkon, protože v každém kroku kurzorová smyčka, spustíte dotaz / proceduru od začátku. Pokud se to rozhodnete udělat, měli byste si být vědomi možných důsledků.
- Předchozí nápověda nás přivádí k poslední odrážce, kdy byste měli používat kurzory. Pokud jste si plně vědomi toho, jak fungují, a jste si docela jisti, že to neovlivní výkon, jděte na to
Kurz serveru SQL Server – Proč je lidé (ne) používají ?
Poslední otázka, na kterou bych rád odpověděl, je: Proč by někdo používal kurzor? Vidím to takto:
- Lidé, kteří je používají pro jednorázové práce nebo pravidelné akce, kde nebudou mít vliv na výkon, mají omluvu. Jedním z důvodů je, že takový kód je procedurální kód, a pokud jste na něj zvyklí, je velmi čitelný
- Na druhou stranu, ti, kteří se začali učit o databázích a jsou zvyklí na procedurální programování, mohou používat kurzory, protože, jak již bylo zmíněno, mají mnohem blíže k procedurálnímu programování než k databázím. To není důvod, proč je používat, protože jedinou omluvou by bylo, že jednoduše neznáte jiný (správný) způsob, jak dělat věci.
- Nejdůležitější věcí na kurzorech je, že jsou pomalé ve srovnání s příkazy SQL, a proto byste se měli vyhnout jejich použití, protože dříve nebo později povedou k problémům s výkonem (pokud nevíte přesně, co děláte a proč)
I považujete za užitečné, abyste pochopili koncept kurzorů, protože existuje velká šance, že se s nimi během cesty setkáte. Byly populární před přidáním některých nových možností na SQL Server. Existuje také šance, že budete pokračovat v práci na systému, kde ho někdo dříve použil, a budete muset pokračovat tam, kde se zastavil. Možná budete muset nahradit kurzor (procedurální kód) kódem SQL (deklarativní kód).
Závěr
U kurzorů neexistuje lepší závěr než – nepoužívat je 🙂 SQL Server implementoval spoustu změn, které řeší problémy, které bylo těžké vyřešit pomocí deklarativního kódu dříve. Lepší strávit nějaký čas vyšetřováním a učením se něčeho nového a nakonec produkcí optimálního kódu. Samozřejmě je můžete použít, pokud víte, proč to děláte, a jste si vědomi možných problémů, které s nimi souvisejí.
Obsah
Naučte se SQL : CREATE DATABASE & CREATE TABLE Operations
Learn SQL: INSERT INTO TABLE
Learn SQL: Primary Key
Learn SQL: Foreign Key
Learn SQL: SELECT statement
Learn SQL: INNER JOIN vs LEFT JOIN
Naučte se SQL: Skripty SQL
Naučte se SQL: Typy vztahů
Naučte se SQL: Připojte se k více tabulkám
Learn SQL: Agregate Functions
Learn SQL: How to Write a Complex SELECT Query?
Naučte se SQL: Databáze INFORMATION_SCHEMA
Naučte se SQL: Datové typy SQL
Naučte se SQL: Teorie množin
Naučte se SQL: Funkce definované uživatelem
Naučte se SQL: Uživatelem definované uložené procedury
Naučte se SQL: Zobrazení SQL
Naučte se SQL: Spouštěče SQL
Naučte se SQL: Procvičujte dotazy SQL
Naučte se SQL: Příklady dotazů SQL
Naučte se SQL: Vytvoření sestavy ručně pomocí dotazů SQL
Naučte se SQL: Funkce data a času na serveru SQL
Naučte se SQL: Vytvoření sestav na serveru SQL pomocí funkcí data a času
Naučte se SQL: kontingenční tabulky serveru SQL
Naučte se SQL: Export serveru SQL do aplikace Excel
Naučte se SQL: Úvod do smyček serveru SQL
Naučte se SQL: Kurzory serveru SQL
Naučte se SQL: Osvědčené postupy SQL pro mazání a aktualizaci dat
Naučte se SQL: Konvence pojmenování
Naučte se SQL: Úlohy související s SQL
Naučte se SQL: Non-Equi se připojuje na SQL Server
Naučte se SQL: Injekce SQL
- autor
- poslední příspěvky
Jeho minulé i současné angažmá se liší od návrhu a kódování databází, přes výuku, konzultace a psaní o databázích. Nezapomeňte také na BI, vytváření algoritmů, šachy, filatelie, 2 psi, 2 kočky, 1 manželka, 1 dítě …
Najdete ho na LinkedIn
Zobrazit všechny příspěvky od Emila Drkusica
- Learn SQL: SQL Injection – 2. listopadu 2020
- Learn SQL: Non-Equi Joins in SQL Server – 29. září 2020
- Learn SQL: Úlohy související s SQL – 1. září 2020