Dans SQL Server, vous pouvez utiliser GOTO
pour modifier le flux d'exécution. Vous pouvez l'utiliser pour "sauter" vers une autre partie du code T-SQL.
La façon dont cela fonctionne est, vous créez une étiquette, puis vous pouvez utiliser GOTO
pour sauter à cette étiquette. Tout code entre GOTO
et l'étiquette sont ignorées et le traitement se poursuit à l'étiquette.
GOTO
les instructions et les étiquettes peuvent être utilisées n'importe où dans une procédure, un lot ou un bloc d'instructions. Ils peuvent également être imbriqués.
Exemple 1 - Utilisation de base
Voici un exemple de base pour illustrer.
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 PRINT 5 Bookmark: PRINT 6
Résultat :
1 2 3 6
Exemple 2 - Les libellés doivent être uniques
Chaque libellé doit être unique au sein d'un lot de requêtes ou d'une procédure stockée.
Voici ce qui se passe si vous fournissez plusieurs fois le même libellé.
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 Bookmark: PRINT 5 Bookmark: PRINT 6
Résultat :
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.
Exemple 3 – Étiquettes hors lot
L'étiquette doit appartenir au même lot que GOTO
. Il ne peut pas aller à une étiquette en dehors du lot actuel.
Voici un exemple d'essai d'accès à une étiquette dans un autre lot :
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 GO PRINT 5 Bookmark: PRINT 6 GO
Résultat :
Msg 133, Level 15, State 1, Line 6 A GOTO statement references the label 'Bookmark' but the label has not been declared.
Dans ce cas, j'ai utilisé le GO
commande pour séparer le code en deux lots.
Exemple 4 - GOTO dans une instruction IF
Vous pouvez utiliser GOTO
dans un IF
déclaration, de sorte qu'il saute à un morceau de code donné en fonction d'une condition étant vraie.
Ici, je mets le @color
variable en Red
et donc le code passe à 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!';
Résultat :
Red Team Finished!
Voici ce qui se passe si je mets @color
à 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!';
Résultat :
Blue Team Finished!
Et pour être complet, voici ce qui se passe si je fournis une couleur différente :
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!';
Résultat :
Other Team Finished!
Évidemment, ce sont des exemples très simples, mais ils démontrent le concept de base de GOTO
.
Exemple 5 - Position de l'étiquette
GOTO
le branchement peut aller vers une étiquette définie avant ou après GOTO
.
Voici un exemple d'accès à une étiquette avant 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!'
Résultat :
1 2 3 4 5 6 7 8 9 Finished!
Vous devez faire attention à ne pas démarrer une boucle infinie lorsque vous placez l'étiquette avant GOTO
mais.
De plus, cet exemple est juste à des fins de démonstration. Vous pourriez obtenir le même résultat en utilisant un WHILE
boucle :
DECLARE @Counter int = 1; WHILE @Counter < 10 BEGIN PRINT @Counter SET @Counter = @Counter + 1 END PRINT 'Finished!'
Résultat :
1 2 3 4 5 6 7 8 9 Finished!