Použití příkazu WHILE v uložených procedurách
po přečtení tohoto článku pochopíte základy použití příkazu WHILE k zápisu smyčky v uložené proceduře.
všechny příklady pro tuto lekci jsou založeny na Microsoft SQL Server Management Studio a ukázkové databáze AdventureWorks a WideWorldImporters. Můžete začít používat tyto bezplatné nástroje s mým průvodcem Začínáme používat SQL Server.
WHILE, BREAK, and CONTINUE
příkaz WHILE se používá k opakovanému spuštění bloku příkazů SQL. Blok se opakovaně provádí, pokud je podmínka příkazu WHILE pravdivá.
ZATÍMCO výroky obecný formát je:
WHILE conditionBEGIN -- code block run when condition is TRUEEND
Pokud se ocitnete opakující se prohlášení, a to zejména ty, které spadají do vzoru, pak je tu možnost, můžete použít, ZATÍMCO prohlášení ušetřit nějaké psaní a váš program více zábavné psát!
Předpokládejme například, že musíte vytvořit dočasnou tabulku obsahující počáteční datum každého týdne. Samozřejmě bychom mohli napsat 52 individuálních INSERT prohlášení, ale to je nuda!
INSERT INTO @myTable VALUES (0, 12/31/2017)INSERT INTO @myTable VALUES (1, 01/07/2018)INSERT INTO @myTable VALUES (2, 01/14/2018)…INSERT INTO @myTable VALUES (52, 12/30/2018 )
místo toho použijte příkaz WHILE pro smyčku 52 týdnů a vložte počáteční datum každého týdne do tabulky. V následujícím příkladu můžete vidět, jak to děláme.
--Setup VariablesDECLARE @myTable TABLE(WeekNumber int, DateStarting smalldatetime)DECLARE @n int = 0DECLARE @firstWeek smalldatetime = '12/31/2017'--Loop Through weeksWHILE @n <= 52BEGIN INSERT INTO @myTable VALUES (@n, DATEADD(wk,@n,@firstWeek)); SELECT @n = @n + 1END--Show ResultsSELECT WeekNumber, DateStartingFROM @myTable
Co dělá toto zaškrtnutí je funkce DATEADD. Všimněte si, že DATEADD (wk, @n, @firstWeek) přidává týdenní pracovní dny k našemu datu @firstWeek. V první iteraci přidá 0 týdnů. Ve druhé iteraci, @n = 1, takže přidá 1 týden, a tak dále.
zde je několik dalších bodů:
- příkaz WHILE testuje proměnnou @n. Pokud je < = 52, programový blok (zelený) může běžet.
- při každém spuštění bloku se proměnná @n zvýší o jednu. Tohle je důležité. Pokud se tak nestalo, hodnota by nikdy neměla být vyšší než 52, a náš program by vykonat blok kódu, dál a dál, bez konce. Tomu se říká nekonečná smyčka.
- výztuž na #2 výše! Je důležité, aby vaše smyčka měla koncovou podmínku. V našem případě se ujistíme, že proměnná @n je zvýšena a že nakonec bude větší než 52.
- použijeme hodnotu @n k „pohonu“ hodnoty data. Přidáním týdnů k našemu základnímu datu @firstWeek můžeme vypočítat následující data začátku týdne.
Zde jsou výsledky:
Jak můžete vidět, z této jednoduché smyčky, jsme byli schopni vytvořit některé zajímavé údaje, a to bylo více zábavné dělat wo pomocí funkce datum, než na „pevný kód“ prohlášení. Použití smyček je velmi silné.
použití přerušení ke zkratu smyčky
příkaz přerušení se používá k násilnému ukončení bloku kódu příkazu WHILE.
v následujícím příkladu jsme změnili příkaz WHILE. Nyní používá příkaz BREAK, který je zbarven zeleně.
existují dvě změny:
- podmínka příkazu WHILE se vždy vyhodnotí jako TRUE, protože @n je vždy větší nebo rovno nule.
- příkaz IF testuje koncovou podmínku a pokud je pravdivý, provede BREAK.
DECLARE @myTable TABLE(WeekNumber int, DateStarting smalldatetime)DECLARE @n int = 0DECLARE @firstWeek smalldatetime = '12/31/2017'WHILE @n > -1BEGIN INSERT INTO @myTable VALUES (@n, DATEADD(wk,@n,@firstWeek)); SELECT @n = @n + 1 IF @n > 52 BREAKEND
příkaz BREAK je užitečný pro ukončení provádění. Pokud jsou příkazy vnořeny, pak je ukončena vnitřní většina smyčky.
pomocí příkazu pokračovat resetujte smyčku
příkaz pokračovat restartuje blok kódu příkazu WHILE. Všechna prohlášení nalezená po pokračování nejsou provedena.
například v následujícím textu se příkaz PRINT nikdy nespustí.
DECLARE @myTable TABLE(WeekNumber int, DateStarting smalldatetime)DECLARE @n int = 0DECLARE @firstWeek smalldatetime = '12/31/2017'WHILE @n > -1BEGIN INSERT INTO @myTable VALUES (@n, DATEADD(wk,@n,@firstWeek)); SELECT @n = @n + 1 IF @n > 52 BREAK ELSE CONTINUE PRINT ‘I Never get executed’END
důvod, proč je buď ZLOMIT prohlášení vynutit UKONČENÍ, nebo když i NADÁLE je běh, smyčka je nastaven na začátku bloku.