Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment utiliser GOTO dans SQL Server

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!