I SQL Server kan du använda GOTO
för att ändra flödet av utförande. Du kan använda den för att "hoppa" till en annan del i T-SQL-koden.
Så det fungerar är att du skapar en etikett och sedan kan du använda GOTO
för att hoppa till den etiketten. Valfri kod mellan GOTO
och etiketten hoppas över, och bearbetningen fortsätter vid etiketten.
GOTO
satser och etiketter kan användas var som helst inom en procedur, batch eller satsblock. De kan också kapslas.
Exempel 1 – Grundläggande användning
Här är ett grundläggande exempel att visa.
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 PRINT 5 Bookmark: PRINT 6
Resultat:
1 2 3 6
Exempel 2 – Etiketter måste vara unika
Varje etikett måste vara unik inom en frågebatch eller lagrad procedur.
Så här händer om du tillhandahåller samma etikett mer än en gång.
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 Bookmark: PRINT 5 Bookmark: PRINT 6
Resultat:
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.
Exempel 3 – Out-of-batch-etiketter
Etiketten måste vara i samma batch som GOTO
. Det kan inte gå till en etikett utanför den aktuella batchen.
Här är ett exempel på hur du försöker gå till en etikett i en annan batch:
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 GO PRINT 5 Bookmark: PRINT 6 GO
Resultat:
Msg 133, Level 15, State 1, Line 6 A GOTO statement references the label 'Bookmark' but the label has not been declared.
I det här fallet använde jag GO
kommando för att dela upp koden i två partier.
Exempel 4 – GÅ TILL i ett IF-uttalande
Du kan använda GOTO
i en IF
sats, så att den hoppar till en given kodbit beroende på att ett villkor är sant.
Här ställer jag in @color
variabel till Red
och så hoppar koden till 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!';
Resultat:
Red Team Finished!
Så här händer om jag ställer in @color
till 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!';
Resultat:
Blue Team Finished!
Och för fullständighetens skull, här är vad som händer om jag anger en annan färg:
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!';
Resultat:
Other Team Finished!
Uppenbarligen är dessa mycket enkla exempel, men de visar det grundläggande konceptet GOTO
.
Exempel 5 – Etikettposition
GOTO
förgrening kan gå till en etikett definierad före eller efter GOTO
.
Här är ett exempel på att gå till en etikett före 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!'
Resultat:
1 2 3 4 5 6 7 8 9 Finished!
Du måste vara försiktig så att du inte startar en oändlig loop när du placerar etiketten innan GOTO
fastän.
Det här exemplet är också bara för demonstrationsändamål. Du kan få samma resultat med en WHILE
loop:
DECLARE @Counter int = 1; WHILE @Counter < 10 BEGIN PRINT @Counter SET @Counter = @Counter + 1 END PRINT 'Finished!'
Resultat:
1 2 3 4 5 6 7 8 9 Finished!