W SQL Server możesz użyć GOTO
zmienić przebieg egzekucji. Możesz go użyć, aby „przeskoczyć” do innej części kodu T-SQL.
Działa to tak, że tworzysz etykietę, a następnie możesz użyć GOTO
aby przejść do tej etykiety. Dowolny kod między GOTO
a etykieta jest pomijana, a przetwarzanie jest kontynuowane na etykiecie.
GOTO
Instrukcje i etykiety mogą być używane w dowolnym miejscu w ramach procedury, partii lub bloku instrukcji. Mogą być również zagnieżdżone.
Przykład 1 – Podstawowe użycie
Oto podstawowy przykład do zademonstrowania.
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 PRINT 5 Bookmark: PRINT 6
Wynik:
1 2 3 6
Przykład 2 – Etykiety muszą być niepowtarzalne
Każda etykieta musi być unikalna w ramach partii zapytania lub procedury składowanej.
Oto, co się stanie, jeśli podasz tę samą etykietę więcej niż raz.
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 Bookmark: PRINT 5 Bookmark: PRINT 6
Wynik:
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.
Przykład 3 – Etykiety poza partiami
Etykieta musi znajdować się w tej samej partii co GOTO
. Nie może przejść do etykiety poza bieżącą partią.
Oto przykład próby przejścia do etykiety w innej partii:
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 GO PRINT 5 Bookmark: PRINT 6 GO
Wynik:
Msg 133, Level 15, State 1, Line 6 A GOTO statement references the label 'Bookmark' but the label has not been declared.
W tym przypadku użyłem GO
polecenie, aby podzielić kod na dwie partie.
Przykład 4 – GOTO w instrukcji IF
Możesz użyć GOTO
w IF
oświadczenie, tak aby przeskakiwał do danego fragmentu kodu w zależności od tego, czy warunek jest prawdziwy.
Tutaj ustawiam @color
zmienna na Red
i tak kod przeskakuje do 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!';
Wynik:
Red Team Finished!
Oto, co się stanie, jeśli ustawię @color
na 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!';
Wynik:
Blue Team Finished!
A dla kompletności, oto co się stanie, jeśli podam inny kolor:
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!';
Wynik:
Other Team Finished!
Oczywiście są to bardzo proste przykłady, ale pokazują podstawową koncepcję GOTO
.
Przykład 5 – Pozycja etykiety
GOTO
rozgałęzienie może przejść do etykiety zdefiniowanej przed lub po GOTO
.
Oto przykład przejścia do etykiety przed 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!'
Wynik:
1 2 3 4 5 6 7 8 9 Finished!
Musisz uważać, aby nie rozpocząć nieskończonej pętli podczas umieszczania etykiety przed GOTO
chociaż.
Również ten przykład służy tylko do celów demonstracyjnych. Możesz uzyskać ten sam wynik, używając WHILE
pętla:
DECLARE @Counter int = 1; WHILE @Counter < 10 BEGIN PRINT @Counter SET @Counter = @Counter + 1 END PRINT 'Finished!'
Wynik:
1 2 3 4 5 6 7 8 9 Finished!