¿Existe algún método para implementar el do while
bucle en SQL Server 2008?
¿Existe algún método para implementar el do while
bucle en SQL Server 2008?
Respuestas:
No estoy seguro acerca de DO-WHILE IN MS SQL Server 2008, pero puede cambiar su lógica de bucle WHILE, para usar como 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 bucle WHILE
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 bucle WHILE 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 bucle WHILE con palabras clave CONTINUE 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 intente evitar bucles a nivel de base de datos. Referencia .
Si no se siente muy ofendido por la GOTO
palabra clave, se puede utilizar 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 T-SQL equivalente usando goto:
DECLARE @I INT=1;
START: -- DO
PRINT @I;
SET @I+=1;
IF @I<=10 GOTO START; -- WHILE @I<=10
Nótese el que uno entre la GOTO
solución activada y el original DO
/ WHILE
pseudocódigo. Una implementación similar usando un WHILE
bucle 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 en particular como un WHILE
bucle simple , ya que no es un buen candidato para una construcción DO
/ WHILE
. Se hizo hincapié en la brevedad del ejemplo más que en la aplicabilidad, ya que los casos legítimos que requieren una DO
/ WHILE
son raros.
REPETIR / HASTA, alguien (NO funciona en T-SQL)?
SET I=1
REPEAT
PRINT I
SET I=I+1
UNTIL I>10
... y la GOTO
solución basada 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 GOTO
y la inversión lógica a través de la NOT
palabra clave, existe una relación muy estrecha entre el pseudocódigo original y la GOTO
solución basada. Una solución similar que usa un WHILE
bucle se 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 WHILE
solución basada 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 todo el desdén en torno al uso de GOTO
, estas incluso podrían ser soluciones idiomáticas para esas pocas ocasiones en las que estas construcciones de bucle (malvadas) en particular 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 difamado GOTO
.
Me parece recordar haber leído este artículo más de una vez, y la respuesta solo se acerca a lo que necesito.
Por lo general, cuando creo que voy a necesitar un DO WHILE
T-SQL es porque estoy iterando un cursor y estoy buscando en gran medida una claridad óptima (frente a la velocidad óptima). En T-SQL, eso 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 de nuevo, yo. Ahora puedo estar seguro de que he 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 forma más limpia de definir individualmente la operación de bucle, que este bucle infinito.
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 sería más relevante cuando tiene un ciclo más complicado y está tratando de realizar un seguimiento de la lógica. Como se indicó, los bucles son caros, así que intente utilizar otros métodos si puede.
Only While Loop es oficialmente compatible con SQL Server. Ya hay una respuesta para DO while loop. Estoy detallando la respuesta sobre las formas de lograr diferentes tipos de bucles en el servidor SQL.
Si lo sabe, debe completar la primera iteración del ciclo de todos modos, entonces puede probar DO..WHILE o REPEAT..UNTIL versión del servidor SQL.
DECLARE @X INT=1;
WAY: --> Here the DO statement
PRINT @X;
SET @X += 1;
IF @X<=10 GOTO WAY;
DECLARE @X INT = 1;
WAY: -- Here the REPEAT statement
PRINT @X;
SET @X += 1;
IFNOT(@X > 10) GOTO WAY;
DECLARE @cnt INT = 0;
WHILE @cnt < 10
BEGIN
PRINT 'Inside FOR LOOP';
SET @cnt = @cnt + 1;
END;
PRINT 'Done FOR LOOP';