T-SQL pętla WHILE

[T-SQL] Pętla WHILE służy do wielokrotnego wykonywania fragmentu kodu, aż do momentu spełnienia zadeklarowanego przez nas warunku.

Składnia T-SQL WHILE

WHILE warunek
    BIGIN
        fragment kodu który będzie się powtarzał
        — w pętli musimy także "odnieść" się do
        — warunku żeby np. zwiększyć wartość zmiennej
        — która występuje w warunku w celu
        — żeby w konsekwencji warunek został spełniony
    END

Przykład.

5 razy wyświetl komunikat "To jest wiersz …" i za każdym razem w miejsce kropek wstaw wartość ze zmiennej @liczba którą inkrementuj o "1" za każdym przejściem pętli WHILE.

DECLARE @liczba int = 1;

WHILE @liczba <6
    BEGIN
        print 'To jest wiersz '+ CAST(@liczba AS VARCHAR)
        SET @liczba += 1 — zwiększamy wartość zmiennej @liczba o 1 za każdym przejściem pętli
    END

Poniżej wynik uruchomienia zapytania.

sql t-sql adventureworks tutorial practical exercises examples pętla while

pętle WHILE oczywiście możemy zagnieżdżać przykład poniżej

DECLARE @liczba int = 1;
DECLARE @liczba2 int = 1;

WHILE @liczba2 <5
    BEGIN
        print 'Pętla "zewnętrzna" wykonała się '+ CAST(@liczba2 AS VARCHAR) + ' razy'
        WHILE @liczba <6
            BEGIN
                print 'To jest wiersz '+ CAST(@liczba AS VARCHAR)
                SET @liczba += 1 — zwiększamy wartość zmiennej @liczba o 1 za każdym przejściem pętli
            END
        SET @liczba = 1
        SET @liczba2 += 1            
    END

Poniżej efekt uruchomienie zapytania

sql t-sql adventureworks tutorial practical exercises examples pętla while

 

Musimy jednak pamiętać o jednej bardzo ważnej rzeczy. W kodzie do pętli "zewnętrznej" (po wykonaniu się pętli "wewnętrznej") musimy ustawić licznik pętli "wewnętrznej" na wartość początkową, bo w przeciwnym razie pętla "wewnętrzna" wykona się tylko jednej raz przy pierwszym przejściu pętli "zewnętrznej".


Często się zdarza, że chcemy wykonać kod w pętli (i chcemy wykorzystać pętlę WHILE) w zależności czy zaistnieją jakieś okoliczności czy też nie np. chcemy zmodyfikować rekord ale nie wiemy czy któryś spełnia warunki wyszukiwania (do późniejszej modyfikacji). Wtedy w warunku do pętli WHILE możemy zastosować funkcję EXIST().

Przy pętlach WHILE musimy pamiętać, że w kodzie w środku pętli musi być taki kod który będzie w jakiś sposób modyfikował warunek bo inaczej zapętlimy pętle i będzie się ona wykonywała w nieskończoność.

Przykład.
W tabeli TabA zamień wszystkie wartości w kolumnie wartość które są równe 'dwa' na wartość 'cztery'.

 DECLARE @identyfikator int;
  WHILE EXISTS(SELECT TOP 1 id FROM TabA WHERE wartosc = 'dwa')
    BEGIN    
        SELECT TOP 1 @identyfikator = id FROM TabA WHERE wartosc = 'dwa'
        UPDATE TabA SET wartosc = 'cztery' WHERE id = @identyfikator
    END

zwróć uwagę że pętla wykona się tyle razy ile razy znajdzie rekord do zmiany (czyli gdzie w kolumnie "wartosc" znajdzie wartość 'dwa'). Jeżeli we wszystkich rekordach zamienimy 'dwa' na 'cztery' to wtedy warunek nie będzie już spełniony i pętla się zakończy.

A co by się stało gdyby warunek w pętli zmienić na EXISTS(SELECT TOP 1 id FROM TabA WHERE id = 1). Wtedy zapętlimy pętlę bo w pętli nigdzie nie modyfikujemy wartości id rekordu o wartości 1 (ID=1).


SQL tutorial. AdventureWorks exercises no.34. SQL SERVER.  SQL tutorial. AdventureWorks exercises no.34. SQL SERVER. SQL tutorial. AdventureWorks exercises SQL SERVER.