In SQL Server können Sie GOTO
verwenden Ausführungsablauf zu verändern. Sie können es verwenden, um zu einem anderen Teil im T-SQL-Code zu „springen“.
So funktioniert es:Sie erstellen ein Etikett und können dann GOTO
verwenden um zu diesem Label zu springen. Jeder Code zwischen GOTO
und das Label werden übersprungen, und die Verarbeitung wird beim Label fortgesetzt.
GOTO
Anweisungen und Labels können überall innerhalb einer Prozedur, eines Stapels oder eines Anweisungsblocks verwendet werden. Sie können auch verschachtelt werden.
Beispiel 1 – Grundlegende Verwendung
Hier ist ein einfaches Beispiel zur Veranschaulichung.
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 PRINT 5 Bookmark: PRINT 6
Ergebnis:
1 2 3 6
Beispiel 2 – Labels müssen eindeutig sein
Jede Bezeichnung muss innerhalb eines Abfragestapels oder einer gespeicherten Prozedur eindeutig sein.
Folgendes passiert, wenn Sie dasselbe Label mehr als einmal bereitstellen.
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 Bookmark: PRINT 5 Bookmark: PRINT 6
Ergebnis:
Msg 132, Level 15, State 1, Line 8 The label 'Bookmark' has already been declared. Label names must be unique within a query batch or stored procedure.
Beispiel 3 – Out-of-Batch-Etiketten
Das Etikett muss sich im gleichen Stapel befinden wie GOTO
. Es kann nicht zu einem Etikett außerhalb des aktuellen Stapels wechseln.
Hier ist ein Beispiel für den Versuch, zu einem Label in einem anderen Stapel zu wechseln:
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 GO PRINT 5 Bookmark: PRINT 6 GO
Ergebnis:
Msg 133, Level 15, State 1, Line 6 A GOTO statement references the label 'Bookmark' but the label has not been declared.
In diesem Fall habe ich den GO
verwendet Befehl, den Code in zwei Stapel aufzuteilen.
Beispiel 4 – GOTO in einer IF-Anweisung
Sie können GOTO
verwenden in einem IF
-Anweisung, sodass sie abhängig davon, ob eine Bedingung wahr ist, zu einem bestimmten Codeabschnitt springt.
Hier setze ich den @color
Variable auf Red
und so springt der Code zu Red_Team
.
DECLARE @color varchar(50) = 'Red'; IF @color = 'Red' GOTO Red_Team IF @color = 'Blue' GOTO Blue_Team ELSE GOTO Other_Team Red_Team: PRINT 'Red Team'; GOTO Finish_Line Blue_Team: PRINT 'Blue Team'; GOTO Finish_Line Other_Team: PRINT 'Other Team'; GOTO Finish_Line Finish_Line: PRINT 'Finished!';
Ergebnis:
Red Team Finished!
Folgendes passiert, wenn ich @color
setze auf Blue
:
DECLARE @color varchar(50) = 'Blue'; IF @color = 'Red' GOTO Red_Team IF @color = 'Blue' GOTO Blue_Team ELSE GOTO Other_Team Red_Team: PRINT 'Red Team'; GOTO Finish_Line Blue_Team: PRINT 'Blue Team'; GOTO Finish_Line Other_Team: PRINT 'Other Team'; GOTO Finish_Line Finish_Line: PRINT 'Finished!';
Ergebnis:
Blue Team Finished!
Und der Vollständigkeit halber passiert Folgendes, wenn ich eine andere Farbe anbiete:
DECLARE @color varchar(50) = 'Orange'; IF @color = 'Red' GOTO Red_Team IF @color = 'Blue' GOTO Blue_Team ELSE GOTO Other_Team Red_Team: PRINT 'Red Team'; GOTO Finish_Line Blue_Team: PRINT 'Blue Team'; GOTO Finish_Line Other_Team: PRINT 'Other Team'; GOTO Finish_Line Finish_Line: PRINT 'Finished!';
Ergebnis:
Other Team Finished!
Offensichtlich sind dies sehr einfache Beispiele, aber sie demonstrieren das grundlegende Konzept von GOTO
.
Beispiel 5 – Etikettenposition
GOTO
die Verzweigung kann zu einem vor oder nach GOTO
definierten Label gehen .
Hier ist ein Beispiel für den Wechsel zu einem Label vor GOTO
:
DECLARE @Counter int = 0; Loop: SET @Counter = @Counter + 1 IF @Counter < 10 PRINT @Counter ELSE GOTO Finish_Line GOTO Loop Finish_Line: PRINT 'Finished!'
Ergebnis:
1 2 3 4 5 6 7 8 9 Finished!
Sie müssen darauf achten, keine Endlosschleife zu starten, wenn Sie das Label vor GOTO
platzieren obwohl.
Außerdem dient dieses Beispiel nur zu Demonstrationszwecken. Sie könnten dasselbe Ergebnis mit einem WHILE
erhalten Schleife:
DECLARE @Counter int = 1; WHILE @Counter < 10 BEGIN PRINT @Counter SET @Counter = @Counter + 1 END PRINT 'Finished!'
Ergebnis:
1 2 3 4 5 6 7 8 9 Finished!