1. Jak tworzyć pętle w SQL Server / T-SQL?
Jak zapewne już wiesz, pętle w programowaniu służą do tzw. zapętlania, a więc wykonywania danego bloku kodu wiele razy. W SQL Server mamy do dyspozycji pętlę WHILE. Składnia pętli WHILE jest następująca:
--tomaszkenig.pl WHILE wyrażenie_logiczne ( warunek wejścia w pętlę ) { wyrażenie_sql | blok_t-sql | BREAK | CONTINUE }
Jeśli warunek wejścia do pętli nie został osiągnięty, blok kodu jest pomijany. Poniżej prosty przykład wykorzystania pętli WHILE w SQL Server w bloku kodu T-SQL. W przykładzie pętla wypisze liczby od 1 do 100. W przykładzie zastosowałem zamianę wartości liczbowej na tekstową przy pomocy funkcji znakowej CAST.
--tomaszkenig.pl DECLARE @intCounter as INT = 1; WHILE @intCounter <= 100 BEGIN PRINT 'Bieżąca wartość licznika to: '+ CAST(@intCounter AS VARCHAR); SET @IntCounter = @IntCounter + 1; END;
Poniżej podobny przykład wykorzystania pętli WHILE z blokiem T-SQL. W tym przykładzie tworzymy dwukolumnową tabelę. Następnie wprowadzamy do pierwszej kolumny liczby od 1 do 1000.
--tomaszkenig.pl CREATE TABLE TABLE_1 (ID INT ); GO declare @IntCounter AS INT = 1; WHILE @IntCounter < 1000 BEGIN INSERT INTO TABLE_1 (ID) VALUES (@IntCounter); SET @IntCounter = @IntCounter + 1; END; GO
2. Warunki wyjścia z pętli i kontynuacji – BREAK I CONTINUE w pętlach Transact-SQL
BREAK w pętli WHILE to warunek wyjścia z pętli. Możemy zastosować taki warunek, jeśli chcemy, by np zakończyć wcześniej pętlę bez względu na warunek wejścia. Polecenie CONTINUE to informacja, by kontynuować dalsze działanie. Zróbmy krótki przykład modyfikujący dane w tabeli TABLE_1 z poprzedniego punktu. Warunek wejścia do pętli to ID mniejsze lub równe 900. Dla wartości mniejszych od 800 pętla za pomocą polecenia UPDATE zmodyfikuje kolumnę VALUE wstawiając do niej wartość „Kurs SQL Server”. Po osiągnięciu ID = 800 powinno nastąpić wcześniejsze wyjście z pętli nieokreślone w warunku wejściowym WHILE.
WHILE (SELECT MIN(ID) FROM TABLE_1 WHERE VALUE IS NULL) <= 900 BEGIN UPDATE TABLE_1 SET VALUE = 'kurs SQL Server' WHERE ID = (SELECT MIN(ID) FROM TABLE_1 WHERE VALUE IS NULL); IF (SELECT MIN(ID) FROM TABLE_1 WHERE VALUE IS NULL) < 800 CONTINUE ELSE BREAK END; GO SELECT * FROM TABLE_1 ORDER BY 1;
Powyższy przykład ma za zadanie zobrazowanie w jaki sposób korzystać z BREAK I CONTINUE. Całość warunku moglibyśmy oczywiście zapisać w warunku wejścia do pętli. Przykład zastosowania pętli WHILE możesz znaleźć też na mojej stronie w artykule o funkcji zliczającej dni robocze w SQL Server. Artykuł jest częścią kursu SQL Server.