sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo usar GOTO en SQL Server

En SQL Server, puede usar GOTO alterar el flujo de ejecución. Puede usarlo para "saltar" a otra parte del código T-SQL.

La forma en que funciona es que creas una etiqueta, luego puedes usar GOTO para saltar a esa etiqueta. Cualquier código entre GOTO y la etiqueta se omiten y el procesamiento continúa en la etiqueta.

GOTO las instrucciones y las etiquetas se pueden usar en cualquier lugar dentro de un procedimiento, lote o bloque de instrucciones. También se pueden anidar.

Ejemplo 1:uso básico

Aquí hay un ejemplo básico para demostrarlo.

PRINT 1
PRINT 2
PRINT 3
GOTO Bookmark
PRINT 4
PRINT 5
Bookmark:
PRINT 6

Resultado:

1
2
3
6

Ejemplo 2:las etiquetas deben ser únicas

Cada etiqueta debe ser única dentro de un lote de consulta o procedimiento almacenado.

Esto es lo que sucede si proporciona la misma etiqueta más de una 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.

Ejemplo 3:etiquetas fuera de lote

La etiqueta debe estar en el mismo lote que GOTO . No puede ir a una etiqueta fuera del lote actual.

Este es un ejemplo de intentar ir a una etiqueta en otro 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.

En este caso, utilicé el GO comando para separar el código en dos lotes.

Ejemplo 4:GOTO en una instrucción IF

Puedes usar GOTO en un IF declaración, de modo que salta a un fragmento de código dado dependiendo de que una condición sea verdadera.

Aquí configuro el @color variable a Red y entonces el código 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!';

Resultado:

Red Team
Finished!

Esto es lo que sucede si configuro @color a 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!

Y en aras de la exhaustividad, esto es lo que sucede si proporciono un color 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 estos son ejemplos muy simples, pero demuestran el concepto básico de GOTO .

Ejemplo 5:Posición de la etiqueta

GOTO la ramificación puede ir a una etiqueta definida antes o después de GOTO .

Aquí hay un ejemplo de ir a una etiqueta 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!

Debe tener cuidado de no iniciar un ciclo infinito al colocar la etiqueta antes de GOTO aunque.

Además, este ejemplo es solo para fines de demostración. Podrías obtener el mismo resultado usando WHILE bucle:

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!