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
Emil je databázový profesionál s více než 10 lety zkušeností ve všem, co souvisí s databázemi. Během let pracoval v IT a finančním průmyslu a nyní pracuje na volné noze.
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

Poslední příspěvky Emila Drkusica (zobrazit všechny)
  • 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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *