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!