while w3schools tabla stored recorrer for ciclo sql-server sql-server-2008 loops while-loop do-while

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/

  1. 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

  2. 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

  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'';

Reference


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.