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!