sql-server - w3schools - while sql server stored procedure
Hacer while loop en SQL Server 2008 (5)
Me parece recordar haber leído este artículo más de una vez, y la respuesta está cerca de lo que necesito.
Por lo general, cuando creo que voy a necesitar un DO WHILE
en T-SQL es porque estoy iterando un cursor, y busco en gran medida una claridad óptima (en comparación con la velocidad óptima). En T-SQL parece ajustarse a WHILE TRUE
/ IF BREAK
.
Si ese es el escenario que lo trajo aquí, este fragmento puede ahorrarle un momento. De lo contrario, bienvenido, yo. Ahora puedo estar seguro de haber estado aquí más de una vez. :)
DECLARE Id INT, @Title VARCHAR(50)
DECLARE Iterator CURSOR FORWARD_ONLY FOR
SELECT Id, Title FROM dbo.SourceTable
OPEN Iterator
WHILE 1=1 BEGIN
FETCH NEXT FROM @InputTable INTO @Id, @Title
IF @@FETCH_STATUS < 0 BREAK
PRINT ''Do something with '' + @Title
END
CLOSE Iterator
DEALLOCATE Iterator
Desafortunadamente, T-SQL no parece ofrecer una manera más limpia de definir de manera individual la operación de bucle, que este bucle infinito.
¿Hay algún método para implementar do while
loop en SQL server 2008?
No estoy seguro acerca de DO-WHILE EN MS SQL Server 2008, pero puede cambiar su lógica de bucle WHILE, para utilizarlo como un bucle DO-WHILE.
Los ejemplos se toman de aquí: http://blog.sqlauthority.com/2007/10/24/sql-server-simple-example-of-while-loop-with-continue-and-break-keywords/
Ejemplo de WHILE Loop
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 END GO
Conjunto resultante:
1 2 3 4 5
Ejemplo de WHILE Loop con la palabra clave BREAK
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 IF @intFlag = 4 BREAK; END GO
Conjunto resultante:
1 2 3
Ejemplo de WHILE Loop con palabras clave CONTINUAR y BREAK
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 CONTINUE; IF @intFlag = 4 -- This will never executed BREAK; END GO
Conjunto resultante:
1 2 3 4 5
Pero trate de evitar bucles a nivel de base de datos. http://blog.sqlauthority.com/2007/10/24/sql-server-simple-example-of-while-loop-with-continue-and-break-keywords/ .
Si no está muy ofendido por la palabra clave GOTO
, se puede usar para simular un DO
/ WHILE
en T-SQL. Considere el siguiente ejemplo bastante absurdo escrito en pseudocódigo:
SET I=1
DO
PRINT I
SET I=I+1
WHILE I<=10
Aquí está el código equivalente de T-SQL que usa goto:
DECLARE @I INT=1;
START: -- DO
PRINT @I;
SET @I+=1;
IF @I<=10 GOTO START; -- WHILE @I<=10
Observe el mapeo uno a uno entre la solución habilitada para GOTO
y el pseudocódigo DO
/ WHILE
original. Una implementación similar usando un bucle WHILE
se vería así:
DECLARE @I INT=1;
WHILE (1=1) -- DO
BEGIN
PRINT @I;
SET @I+=1;
IF NOT (@I<=10) BREAK; -- WHILE @I<=10
END
Ahora, por supuesto, podría reescribir este ejemplo particular como un simple bucle WHILE
, ya que este no es un buen candidato para un constructo DO
/ WHILE
. El énfasis se puso en la brevedad de los ejemplos en lugar de la aplicabilidad, ya que los casos legítimos que requieren un DO
/ WHILE
son raros.
REPEAT / UNTIL, alguien (NO funciona en T-SQL)?
SET I=1
REPEAT
PRINT I
SET I=I+1
UNTIL I>10
... y la solución basada en GOTO
en T-SQL:
DECLARE @I INT=1;
START: -- REPEAT
PRINT @I;
SET @I+=1;
IF NOT(@I>10) GOTO START; -- UNTIL @I>10
Mediante el uso creativo de GOTO
y la inversión lógica a través de la palabra clave NOT
, existe una relación muy estrecha entre el pseudocódigo original y la solución basada en GOTO
. Una solución similar usando un ciclo WHILE
ve así:
DECLARE @I INT=1;
WHILE (1=1) -- REPEAT
BEGIN
PRINT @I;
SET @I+=1;
IF @I>10 BREAK; -- UNTIL @I>10
END
Se puede argumentar que para el caso de REPEAT
/ UNTIL
, la solución basada en WHILE
es más simple, porque la condición if no está invertida. Por otro lado, también es más detallado.
Si no fuera por el desprecio por el uso de GOTO
, estas podrían ser incluso soluciones idiomáticas para esas pocas veces cuando estas construcciones particulares (malvadas) de bucle son necesarias en el código T-SQL en aras de la claridad.
Úselos a su propia discreción, tratando de no sufrir la ira de sus compañeros desarrolladores cuando lo atrapen usando el tan maligno GOTO
.
Solo While Loop es oficialmente compatible con el servidor SQL. Ya hay una answer para DO while loop. Estoy detallando la respuesta sobre formas de lograr diferentes tipos de bucles en el servidor SQL.
Si lo sabes, debes completar la primera iteración del ciclo de todos modos, entonces puedes probar la versión DO..WHILE o REPEAT..UNTIL de SQL Server.
DO..WHILE Loop
DECLARE @X INT=1;
WAY: --> Here the DO statement
PRINT @X;
SET @X += 1;
IF @X<=10 GOTO WAY;
REPETIR..UNTIL Loop
DECLARE @X INT = 1;
WAY: -- Here the REPEAT statement
PRINT @X;
SET @X += 1;
IFNOT(@X > 10) GOTO WAY;
En bucle
DECLARE @cnt INT = 0;
WHILE @cnt < 10
BEGIN
PRINT ''Inside FOR LOOP'';
SET @cnt = @cnt + 1;
END;
PRINT ''Done FOR LOOP'';
También puede usar una variable de salida si desea que su código sea un poco más legible:
DECLARE @Flag int = 0
DECLARE @Done bit = 0
WHILE @Done = 0 BEGIN
SET @Flag = @Flag + 1
PRINT @Flag
IF @Flag >= 5 SET @Done = 1
END
Esto probablemente sea más relevante cuando tenga un bucle más complicado y trate de hacer un seguimiento de la lógica. Como los bucles indicados son caros, intente utilizar otros métodos si puede.