Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como usar GOTO no SQL Server


No SQL Server, você pode usar GOTO alterar o fluxo de execução. Você pode usá-lo para “saltar” para outra parte do código T-SQL.

A forma como funciona é, você cria um rótulo, então você pode usar GOTO para pular para esse rótulo. Qualquer código entre GOTO e o rótulo são ignorados e o processamento continua no rótulo.

GOTO instruções e rótulos podem ser usados ​​em qualquer lugar dentro de um procedimento, lote ou bloco de instruções. Eles também podem ser aninhados.


Exemplo 1 – Uso básico


Aqui está um exemplo básico para demonstrar.
PRINT 1
PRINT 2
PRINT 3
GOTO Bookmark
PRINT 4
PRINT 5
Bookmark:
PRINT 6

Resultado:
1
2
3
6

Exemplo 2 – Rótulos devem ser exclusivos


Cada rótulo deve ser exclusivo em um lote de consulta ou procedimento armazenado.

Veja o que acontece se você fornecer o mesmo rótulo mais de uma vez.
PRINT 1
PRINT 2
PRINT 3
GOTO Bookmark
PRINT 4
Bookmark:
PRINT 5
Bookmark:
PRINT 6

Resultado:
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.

Exemplo 3 – Etiquetas fora do lote


A etiqueta deve estar no mesmo lote que GOTO . Ele não pode ir para um rótulo fora do lote atual.

Aqui está um exemplo de tentativa de acessar um rótulo em outro lote:
PRINT 1
PRINT 2
PRINT 3
GOTO Bookmark
PRINT 4
GO

PRINT 5
Bookmark:
PRINT 6
GO

Resultado:
Msg 133, Level 15, State 1, Line 6
A GOTO statement references the label 'Bookmark' but the label has not been declared.

Neste caso, usei o GO comando para separar o código em dois lotes.

Exemplo 4 – GOTO em uma instrução IF


Você pode usar GOTO em um IF declaração, para que salte para um determinado pedaço de código dependendo de uma condição ser verdadeira.

Aqui eu defino o @color variável para Red e assim o código salta para 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!';

Resultado:
Red Team
Finished!

Aqui está o que acontece se eu definir @color para 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!';

Resultado:
Blue Team
Finished!

E para completar, aqui está o que acontece se eu fornecer uma cor diferente:
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!';

Resultado:
Other Team
Finished!

Obviamente estes são exemplos muito simples, mas eles demonstram o conceito básico de GOTO .

Exemplo 5 – Posição do rótulo


GOTO a ramificação pode ir para um rótulo definido antes ou depois de GOTO .

Aqui está um exemplo de como ir para um rótulo antes de 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!'

Resultado:
1
2
3
4
5
6
7
8
9
Finished!

Você precisa ter cuidado para não iniciar um loop infinito ao colocar o rótulo antes de GOTO no entanto.

Além disso, este exemplo é apenas para fins de demonstração. Você pode obter o mesmo resultado usando um WHILE ciclo:
DECLARE @Counter int = 1;

WHILE @Counter < 10
BEGIN
  PRINT @Counter
  SET @Counter = @Counter + 1
END
PRINT 'Finished!'

Resultado:
1
2
3
4
5
6
7
8
9
Finished!