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!