Verwenden der WHILE-Anweisung in gespeicherten Prozeduren
Nachdem Sie diesen Artikel gelesen haben, werden Sie die Grundlagen der Verwendung der WHILE-Anweisung zum Schreiben einer Schleife innerhalb einer gespeicherten Prozedur verstehen.
Alle Beispiele für diese Lektion basieren auf Microsoft SQL Server Management Studio und den Beispieldatenbanken AdventureWorks und WideWorldImporters. Sie können mit diesen kostenlosen Tools mit meinem Leitfaden Erste Schritte mit SQL Server beginnen.
WHILE, BREAK und CONTINUE
Die WHILE-Anweisung wird verwendet, um einen Block von SQL-Anweisungen wiederholt auszuführen. Der Block wird wiederholt ausgeführt, wenn die Bedingung der WHILE-Anweisung wahr ist.
Das allgemeine Format der WHILE-Anweisungen lautet:
WHILE conditionBEGIN -- code block run when condition is TRUEEND
Wenn Sie feststellen, dass Sie Anweisungen wiederholen, insbesondere solche, die in ein Muster fallen, besteht die Möglichkeit, dass Sie eine WHILE-Anweisung verwenden können, um etwas Tippen zu sparen und das Schreiben Ihres Programms unterhaltsamer zu gestalten!Angenommen, Sie müssen eine temporäre Tabelle erstellen, die das Anfangsdatum jeder Woche enthält. Natürlich könnten wir 52 einzelne INSERT-Anweisungen schreiben, aber das ist langweilig!
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 )
Verwenden Sie stattdessen den Befehl WHILE, um die 52 Wochen zu durchlaufen und das Anfangsdatum jeder Woche in die Tabelle einzufügen. Wie wir das machen, sehen Sie im folgenden Beispiel.
--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
Was dieses Häkchen macht, ist die Funktion DATEADD. Beachten Sie, dass DATEADD(wk, @n, @firstWeek) unserem @firstWeek-Datum die Anzahl der Tage einer Woche hinzufügt. In der ersten Iteration werden 0 Wochen hinzugefügt. In der zweiten Iteration ist @n = 1, also fügt es 1 Woche hinzu und so weiter.
Hier sind einige weitere Punkte:
- Die WHILE-Anweisung testet die Variable @n. Wenn es <= 52 ist, kann der Programmblock (grün) ausgeführt werden.
- Jedes Mal, wenn der Block ausgeführt wird, wird die Variable @n um eins erhöht. Das ist wichtig. Wenn dies nicht der Fall wäre, wäre der Wert niemals größer als 52, und unser Programm würde den Codeblock immer wieder ohne Ende ausführen. Dies wird als Endlosschleife bezeichnet.
- Zurück zu #2 oben! Es ist wichtig, dass Ihre Schleife eine Endbedingung hat. In unserem Fall stellen wir sicher, dass die Variable @n inkrementiert wird und dass sie schließlich größer als 52 ist.
- Wir verwenden den Wert @n , um den Datumswert zu „fahren“. Durch Hinzufügen von Wochen zu unserem Basisdatum @firstWeek können wir die Daten der nachfolgenden Anfangswoche berechnen.
Hier sind die Ergebnisse:
Wie Sie sehen können, konnten wir aus dieser einfachen Schleife einige interessante Daten erstellen, und es hat mehr Spaß gemacht, dies mit Datumsfunktionen zu tun, als die Anweisung „hart zu codieren“. Die Verwendung von Schleifen ist sehr leistungsfähig.
Verwenden von BREAK zum Kurzschließen einer Schleife
Die BREAK-Anweisung wird verwendet, um den Codeblock einer WHILE-Anweisung zwangsweise zu verlassen.
Im folgenden Beispiel haben wir die WHILE-Anweisung geändert. Es verwendet jetzt die BREAK-Anweisung, die grün gefärbt ist.
Es gibt zwei Änderungen:
- Die WHILE-Anweisungsbedingung wird immer als TRUE ausgewertet, da @n immer größer oder gleich Null ist.
- Die IF-Anweisung testet die Endbedingung und führt, wenn TRUE, BREAK aus.
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
Die BREAK-Anweisung ist nützlich, um die Ausführung zu beenden. Wenn WHILE-Anweisungen verschachtelt sind, wird die innerste Schleife verlassen.
CONTINUE verwenden, um eine Schleife zurückzusetzen
Die CONTINUE-Anweisung startet den Codeblock einer WHILE-Anweisung neu. Alle nach CONTINUE gefundenen Anweisungen werden nicht ausgeführt.
Im folgenden Beispiel wird die PRINT-Anweisung nie ausgeführt.
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
Der Grund ist entweder, dass die BREAK-Anweisung einen EXIT erzwingt, oder wenn die CONTINUE ausgeführt wird, wird die Schleife auf den Anfang des Blocks zurückgesetzt.