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!