Używanie instrukcji WHILE w procedurach składowanych
Po przeczytaniu tego artykułu zrozumiesz podstawy używania instrukcji WHILE do pisania pętli w ramach procedury składowanej.
wszystkie przykłady tej lekcji są oparte na Microsoft SQL Server Management Studio i przykładowych bazach danych AdventureWorks i WideWorldImporters. Możesz zacząć korzystać z tych bezpłatnych narzędzi z moim przewodnikiem pierwsze kroki przy użyciu SQL Server.
WHILE, BREAK I CONTINUE
Instrukcja WHILE jest używana do wielokrotnego wykonywania bloku instrukcji SQL. Blok jest wielokrotnie wykonywany, jeśli warunek instrukcji WHILE jest true.
ogólny format instrukcji WHILE to:
WHILE conditionBEGIN -- code block run when condition is TRUEEND
jeśli powtarzasz instrukcje, zwłaszcza te, które wchodzą w schemat, istnieje możliwość, że możesz użyć instrukcji WHILE, aby zapisać trochę pisania i sprawić, że twój program będzie przyjemniejszy w pisaniu!
Załóżmy na przykład, że musisz utworzyć tymczasową tabelę zawierającą datę początkową każdego tygodnia. Oczywiście moglibyśmy napisać 52 pojedyncze wypowiedzi INSERT, ale to jest nudne!
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 )
zamiast tego użyj polecenia WHILE, aby zapętlić 52 tygodnie, wstawiając datę rozpoczęcia każdego tygodnia do tabeli. Możesz zobaczyć, jak to robimy w poniższym przykładzie.
--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
to, co sprawia, że ten tik jest funkcją DATEADD. Zauważ, że DATEADD (WK, @n, @firstWeek) dodaje tydzień pracy dni do naszej daty @firstWeek. W pierwszej iteracji dodaje 0 tygodni. W drugiej iteracji, @N = 1, więc dodaje 1 tydzień, i tak dalej.
oto kilka punktów:
- Instrukcja WHILE sprawdza zmienną @n. Jeśli jest to<= 52, blok programu (zielony) może zostać uruchomiony.
- za każdym razem, gdy blok jest uruchamiany, zmienna @n jest zwiększana o jeden. To ważne. Gdyby tak się nie stało, wartość Nigdy nie byłaby większa niż 52, a nasz program wykonałby blok kodu, bez końca. Nazywa się to nieskończoną pętlą.
- wzmocnienie do # 2 powyżej! Ważne jest, aby pętla miała warunek końcowy. W naszym przypadku upewniamy się, że zmienna @n jest zwiększana i że ostatecznie będzie większa niż 52.
- używamy wartości @n do „napędzania” wartości daty. Dodając tygodnie do daty bazowej @firstWeek, możemy obliczyć kolejne daty początkowego tygodnia.
oto wyniki:
jak widać, z tej prostej pętli udało nam się stworzyć kilka interesujących danych i łatwiej było zrobić wo za pomocą funkcji daty, niż „hard code” instrukcji. Używanie pętli jest bardzo potężne.
użycie BREAK do zwarcia pętla
Instrukcja BREAK jest używana do wymuszonego wyjścia z bloku kodu instrukcji WHILE.
w poniższym przykładzie zmieniliśmy instrukcję WHILE. Teraz używa instrukcji BREAK, która jest zabarwiona na Zielono.
są dwie zmiany:
- warunek instrukcji WHILE zawsze zwraca wartość TRUE, ponieważ @n jest zawsze większe lub równe zero.
- Instrukcja IF sprawdza warunek końcowy, a gdy TRUE, wykonuje 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
Instrukcja BREAK jest przydatna do zakończenia wykonywania. Jeżeli polecenia WHILE są zagnieżdżone, wtedy zostanie wywołana wewnętrzna pętla most.
użycie polecenia CONTINUE do zresetowania pętli
polecenie CONTINUE uruchamia ponownie blok kodu instrukcji WHILE. Wszelkie polecenia znalezione po CONTINUE nie są wykonywane.
na przykład w poniższej instrukcji PRINT nigdy nie jest wykonywana.
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
powodem jest albo polecenie BREAK wymusza wyjście, albo gdy kontynuacja jest uruchomiona, pętla jest resetowana na początek bloku.