In SQL Server kunt u GOTO
. gebruiken om de uitvoeringsstroom te veranderen. Je kunt het gebruiken om naar een ander deel in de T-SQL-code te "springen".
De manier waarop het werkt, is dat u een label maakt en vervolgens GOTO
. kunt gebruiken om naar dat label te springen. Elke code tussen GOTO
en het label worden overgeslagen en de verwerking gaat door op het label.
GOTO
verklaringen en labels kunnen overal binnen een procedure, batch of instructieblok worden gebruikt. Ze kunnen ook worden genest.
Voorbeeld 1 – Basisgebruik
Hier is een eenvoudig voorbeeld om te demonstreren.
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 PRINT 5 Bookmark: PRINT 6
Resultaat:
1 2 3 6
Voorbeeld 2 – Labels moeten uniek zijn
Elk label moet uniek zijn binnen een querybatch of opgeslagen procedure.
Dit gebeurt er als je hetzelfde label meer dan eens opgeeft.
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 Bookmark: PRINT 5 Bookmark: PRINT 6
Resultaat:
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.
Voorbeeld 3 – Labels buiten de batch
Het label moet in dezelfde batch zitten als GOTO
. Het kan niet naar een label gaan buiten de huidige batch.
Hier is een voorbeeld van proberen naar een label in een andere batch te gaan:
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 GO PRINT 5 Bookmark: PRINT 6 GO
Resultaat:
Msg 133, Level 15, State 1, Line 6 A GOTO statement references the label 'Bookmark' but the label has not been declared.
In dit geval gebruikte ik de GO
commando om de code in twee batches te splitsen.
Voorbeeld 4 – GOTO in een IF-statement
U kunt GOTO
. gebruiken in een IF
statement, zodat het naar een bepaald stuk code springt, afhankelijk van het feit dat een voorwaarde waar is.
Hier stel ik de @color
. in variabele naar Red
en dus springt de code naar 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!';
Resultaat:
Red Team Finished!
Dit gebeurt er als ik @color
instel naar 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!';
Resultaat:
Blue Team Finished!
En voor de volledigheid, dit is wat er gebeurt als ik een andere kleur opgeef:
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!';
Resultaat:
Other Team Finished!
Uiteraard zijn dit zeer eenvoudige voorbeelden, maar ze demonstreren het basisconcept van GOTO
.
Voorbeeld 5 – Labelpositie
GOTO
vertakking kan naar een label gaan dat is gedefinieerd voor of na GOTO
.
Hier is een voorbeeld van naar een label gaan vóór 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!'
Resultaat:
1 2 3 4 5 6 7 8 9 Finished!
U moet oppassen dat u geen oneindige lus start wanneer u het label vóór GOTO
plaatst hoewel.
Dit voorbeeld is ook alleen voor demonstratiedoeleinden. U kunt hetzelfde resultaat krijgen met een WHILE
lus:
DECLARE @Counter int = 1; WHILE @Counter < 10 BEGIN PRINT @Counter SET @Counter = @Counter + 1 END PRINT 'Finished!'
Resultaat:
1 2 3 4 5 6 7 8 9 Finished!