In SQL Server puoi usare GOTO
per alterare il flusso di esecuzione. Puoi usarlo per "saltare" in un'altra parte del codice T-SQL.
Il modo in cui funziona è creare un'etichetta, quindi puoi utilizzare GOTO
per passare a quell'etichetta. Qualsiasi codice tra GOTO
e l'etichetta vengono saltate e l'elaborazione continua sull'etichetta.
GOTO
istruzioni ed etichette possono essere utilizzate ovunque all'interno di una procedura, batch o blocco di istruzioni. Possono anche essere nidificati.
Esempio 1 – Utilizzo di base
Ecco un esempio di base da dimostrare.
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 PRINT 5 Bookmark: PRINT 6
Risultato:
1 2 3 6
Esempio 2:le etichette devono essere univoche
Ogni etichetta deve essere univoca all'interno di un batch di query o di una stored procedure.
Ecco cosa succede se fornisci la stessa etichetta più di una volta.
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 Bookmark: PRINT 5 Bookmark: PRINT 6
Risultato:
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.
Esempio 3 – Etichette fuori batch
L'etichetta deve essere nello stesso batch di GOTO
. Non può andare su un'etichetta al di fuori del batch corrente.
Ecco un esempio di tentativo di passare a un'etichetta in un altro batch:
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 GO PRINT 5 Bookmark: PRINT 6 GO
Risultato:
Msg 133, Level 15, State 1, Line 6 A GOTO statement references the label 'Bookmark' but the label has not been declared.
In questo caso, ho usato il GO
comando per separare il codice in due batch.
Esempio 4 – GOTO in un'istruzione IF
Puoi usare GOTO
in un IF
istruzione, in modo che salti a un dato pezzo di codice a seconda che una condizione sia vera.
Qui ho impostato il @color
variabile in Red
e quindi il codice salta a 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!';
Risultato:
Red Team Finished!
Ecco cosa succede se imposto @color
su 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!';
Risultato:
Blue Team Finished!
E per completezza, ecco cosa succede se fornisco un colore diverso:
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!';
Risultato:
Other Team Finished!
Ovviamente questi sono esempi molto semplici, ma dimostrano il concetto base di GOTO
.
Esempio 5 – Posizione dell'etichetta
GOTO
branching può andare a un'etichetta definita prima o dopo GOTO
.
Ecco un esempio di accesso a un'etichetta prima di 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!'
Risultato:
1 2 3 4 5 6 7 8 9 Finished!
È necessario fare attenzione a non avviare un ciclo infinito quando si posiziona l'etichetta prima di GOTO
anche se.
Inoltre, questo esempio è solo a scopo dimostrativo. Potresti ottenere lo stesso risultato usando un WHILE
ciclo:
DECLARE @Counter int = 1; WHILE @Counter < 10 BEGIN PRINT @Counter SET @Counter = @Counter + 1 END PRINT 'Finished!'
Risultato:
1 2 3 4 5 6 7 8 9 Finished!