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!