Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come utilizzare GOTO in SQL Server

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!