I SQL Server kan du bruge GOTO at ændre strømmen af udførelse. Du kan bruge den til at "hoppe" til en anden del i T-SQL-koden.
Måden det fungerer på er, at du opretter en etiket, og derefter kan du bruge GOTO at hoppe til den etiket. Enhver kode mellem GOTO og etiketten springes over, og behandlingen fortsætter ved etiketten.
GOTO erklæringer og etiketter kan bruges hvor som helst inden for en procedure, batch eller sætningsblok. De kan også indlejres.
Eksempel 1 – Grundlæggende brug
Her er et grundlæggende eksempel at demonstrere.
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 PRINT 5 Bookmark: PRINT 6
Resultat:
1 2 3 6
Eksempel 2 – Etiketter skal være unikke
Hver etiket skal være unik i en forespørgselsbatch eller lagret procedure.
Her er, hvad der sker, hvis du angiver den samme etiket mere end én gang.
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.
Eksempel 3 – Out-of-Batch-etiketter
Etiketten skal være i samme batch som GOTO . Den kan ikke gå til en etiket uden for den aktuelle batch.
Her er et eksempel på at prøve at gå til en etiket i en anden 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 dette tilfælde brugte jeg GO kommando for at adskille koden i to batches.
Eksempel 4 – GÅ TIL I en IF-erklæring
Du kan bruge GOTO i en IF sætning, så den hopper til et givet stykke kode afhængigt af, at en betingelse er sand.
Her indstiller jeg @color variabel til Red og så springer koden til 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!
Her er, hvad der sker, hvis jeg indstiller @color til 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!
Og for fuldstændighedens skyld er der her, hvad der sker, hvis jeg angiver en anden farve:
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!
Disse er naturligvis meget simple eksempler, men de demonstrerer det grundlæggende koncept for GOTO .
Eksempel 5 – Etiketposition
GOTO forgrening kan gå til en etiket defineret før eller efter GOTO .
Her er et eksempel på at gå til en etiket fø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!'
Resultat:
1 2 3 4 5 6 7 8 9 Finished!
Du skal passe på ikke at starte en uendelig løkke, når du placerer etiketten før GOTO selvom.
Dette eksempel er også kun til demonstrationsformål. Du kan få det samme resultat ved at bruge en WHILE sløjfe:
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!