SQL es un lenguaje muy diferente en comparación con lo que estás acostumbrado. Se centra en qué , no cómo . Le dice a SQL Server qué resultados desea y deja que descubra cómo producir la respuesta. O, para reformular lo que acabo de decir, no hay un bucle for en SQL.
Damien_The_Unbeliever
55
WHILE @I < 10; SET @I = @I + 1; BEGIN; ...; END? Sin embargo, esto no debe usarse para la mayoría del procesamiento de consultas (pero a veces es necesario para la manipulación imperativa). Muchas de estas instrucciones / sugerencias están disponibles en Google usando la búsqueda "tsql for loop".
77
Evite bucles a favor de JOINs y establezca operaciones.
Finalizado
2
Si no es experto en SQL, no debería considerar usar un bucle. Solo hay unas pocas condiciones en las que se necesita una y la mayoría del resto del tiempo, usar un bucle es el equivalente a empujar su automóvil en lugar de conducirlo. Aprenda a pensar en términos de conjuntos de datos en lugar de recorrer los registros. El bucle es una función de nivel experto, no porque la sintaxis sea difícil, sino porque necesita saber exactamente cuánto daño puede hacer con ella antes de poder usarla.
HLGEM
2
A veces, podría usarse para conjurar rápidamente datos de prueba en una base de datos de prueba que de todos modos solo va a eliminar poco después. En ese caso, usar esto elimina la necesidad de pasar por un programa separado escrito en algo más como C #, y la ingeniería no es una preocupación particularmente importante. De nuevo, solo digo esto en términos de datos de prueba.
Las UNIONES (y las operaciones de configuración) deberían preferirse a las construcciones en bucle en SQL.
Finalizado
66
No hay límite en el estrés (especialmente para aquellos que son nuevos en SQL), lo que Damien dijo: "SQL es un lenguaje muy diferente en comparación con lo que estás acostumbrado. Está enfocado en qué, no cómo. Le dices a SQL Server qué resultados que desea y deje que
descubra
1
Es interesante notar que la documentación de MS está mal aquí, realmente. MIENTRAS que no toma una expresión booleana, toma un predicado, que además de poder evaluar como VERDADERO o FALSO, también podría ser DESCONOCIDO.
Damien_The_Unbeliever
360
No hay for-loop, solo el while-loop:
DECLARE@i int =0WHILE@i <20BEGINSET@i =@i +1/* do some work */END
Tenga en cuenta que si tiene la intención de utilizar el índice en el bucle, es posible que desee aumentar lo último en lugar de lo primero, dependiendo de su caso de uso.
jinglesthula
3
También tenga en cuenta que el valor predeterminado para la variable local no es compatible con SQL simple. Por lo tanto, necesita separarse SET @i = 0antes para el bucle.
Nux
1
@Nux: el 0 se establece durante la declaración explícitamente
TcKs
77
Sí, pero eso no funciona en servidores SQL más antiguos (al menos no en 2005).
Nux
Además, debe tenerse en cuenta que generalmente el trabajo se realiza antes de que se incremente el número entero. Muchos bucles for en SQL realmente usan ese número entero en su trabajo (iterando de fila en fila o de resultado a resultado en tablas temporales) y pueden descartarse si el incremento ocurre al comienzo del ciclo en lugar de al final.
CSS
34
Información extra
Solo para agregar, ya que nadie ha publicado una respuesta que incluya cómo iterar realmente a través de un conjunto de datos dentro de un bucle, puede usar las palabras clave OFFSET FETCH .
Uso
DECLARE@i INT =0;SELECT@count= Count(*)FROM{TABLE}WHILE@i <=@count
BEGINSELECT*FROM{TABLE}ORDERBY{COLUMN}
OFFSET @i ROWSFETCH NEXT 1ROWS ONLY
SET@i =@i +1;END
¡Bienvenido a Stack Overflow! ¿Consideraría agregar alguna narrativa para explicar por qué funciona este código y qué lo convierte en una respuesta a la pregunta? Esto sería muy útil para la persona que hace la pregunta y para cualquier otra persona que se presente.
Andrew Barber
18
Esto se explica por sí mismo.
Edward Olamisan
44
¿Cómo es que esto no se explica por sí mismo? Tenía la misma pregunta, entendí la respuesta de inmediato.
DanteTheSmith
1
¿En qué se diferencia esta respuesta de @TcKs excepto la convención de nomenclatura?
Sushil Jadhav
7
Qué tal esto:
BEGIN
Do Something
END
GO 10
... por supuesto, podría poner un contador incremental dentro si necesita contar.
For loop aún no es oficialmente compatible con el servidor SQL. Ya hay una respuesta para lograr las diferentes formas de FOR Loop. Estoy detallando la respuesta sobre formas de lograr diferentes tipos de bucles en el servidor SQL.
En bucle
DECLARE@cnt INT =0;WHILE@cnt <10BEGINPRINT'Inside FOR LOOP';SET@cnt =@cnt +1;END;PRINT'Done FOR LOOP';
Si lo sabe, debe completar la primera iteración del bucle de todos modos, entonces puede probar la versión DO..WHILE o REPEAT..UNTIL del servidor SQL.
HACER ... MIENTRAS
DECLARE@X INT=1;
WAY:--> Here the DO statementPRINT@X;SET@X +=1;IF@X<=10GOTO WAY;
REPETIR..UNTIL Loop
DECLARE@X INT =1;
WAY:-- Here the REPEAT statementPRINT@X;SET@X +=1;
IFNOT(@X >10)GOTO WAY;
WHILE @I < 10; SET @I = @I + 1; BEGIN; ...; END
? Sin embargo, esto no debe usarse para la mayoría del procesamiento de consultas (pero a veces es necesario para la manipulación imperativa). Muchas de estas instrucciones / sugerencias están disponibles en Google usando la búsqueda "tsql for loop".Respuestas:
T-SQL no tiene un
FOR
bucle, tiene unWHILE
bucleMIENTRAS (Transact-SQL)
fuente
No hay for-loop, solo el while-loop:
fuente
SET @i = 0
antes para el bucle.Información extra
Solo para agregar, ya que nadie ha publicado una respuesta que incluya cómo iterar realmente a través de un conjunto de datos dentro de un bucle, puede usar las palabras clave OFFSET FETCH .
Uso
fuente
fuente
Qué tal esto:
... por supuesto, podría poner un contador incremental dentro si necesita contar.
fuente
For loop aún no es oficialmente compatible con el servidor SQL. Ya hay una respuesta para lograr las diferentes formas de FOR Loop. Estoy detallando la respuesta sobre formas de lograr diferentes tipos de bucles en el servidor SQL.
En bucle
Si lo sabe, debe completar la primera iteración del bucle de todos modos, entonces puede probar la versión DO..WHILE o REPEAT..UNTIL del servidor SQL.
HACER ... MIENTRAS
REPETIR..UNTIL Loop
Referencia
fuente
La respuesta simple es
NO !!
.MIENTRAS :
IR :
Siempre prefiero
WHILE
a laGOTO
declaración.fuente
Mientras que el ejemplo de bucle en T-SQL que enumera la fecha de inicio a fin del mes actual.
fuente
Pruébalo, aprendelo:
Con fecha:
fuente