WHILE, BREAK y CONTINUE: repetir con un límite visible
SQL está diseñado principalmente para operar sobre conjuntos: indicar qué filas deben afectarse sin recorrerlas una por una. Aun así, algunos procesos necesitan repetir un bloque mientras una condición siga cumpliéndose.
WHILE crea el ciclo. BREAK lo termina y CONTINUE pasa directamente a la siguiente evaluación de la condición.
Control del ciclo
WHILE: repetir mientras se cumpla una condición
WHILE evalúa una condición antes de cada vuelta. Si es verdadera, ejecuta el bloque y vuelve a comprobarla.
WHILE Condicion
BEGIN
-- Instrucciones repetidas.
END;
BREAK: terminar el ciclo
BREAK abandona el WHILE que lo contiene y continúa con la instrucción situada después del ciclo.
IF CondicionDeSalida
BREAK;
CONTINUE: pasar a la siguiente vuelta
CONTINUE deja de ejecutar las instrucciones restantes de la vuelta actual y regresa a la evaluación de WHILE.
IF CondicionParaSiguienteVuelta
CONTINUE;
El ciclo debe modificar algún valor relacionado con su condición. De lo contrario puede ejecutarse indefinidamente.
Ejemplo: recorrer meses
DATEADD(MONTH, 1, @MesActual) suma un mes al valor actual. EOMONTH(@MesActual) devuelve el último día de ese mismo mes; ambas funciones trabajan con fechas, no con textos formateados.
DECLARE @MesActual DATE = '2026-01-01';
DECLARE @MesFinal DATE = '2026-04-01';
WHILE @MesActual < @MesFinal
BEGIN
SELECT
@MesActual AS InicioMes,
EOMONTH(@MesActual) AS FinMes;
SET @MesActual = DATEADD(MONTH, 1, @MesActual);
END;
El valor avanza un mes en cada vuelta. La condición deja de cumplirse antes de abril.
Interrumpir el ciclo
DECLARE @Intento INT = 0;
WHILE @Intento < 10
BEGIN
SET @Intento += 1;
IF @Intento = 4
BREAK;
SELECT @Intento AS IntentoProcesado;
END;
BREAK termina el WHILE completo cuando el contador llega a 4.
Saltar una vuelta
DECLARE @Numero INT = 0;
WHILE @Numero < 5
BEGIN
SET @Numero += 1;
IF @Numero = 3
CONTINUE;
SELECT @Numero AS NumeroProcesado;
END;
El número 3 no llega al SELECT, pero el ciclo continúa con 4. Actualizamos el contador antes de CONTINUE; colocarlo después podría crear un ciclo sin avance.
Procesar por lotes
Un uso práctico consiste en modificar un número controlado de filas por vuelta para limitar transacciones y bloqueos. Ese patrón necesita una llave estable —un valor único que no cambia entre vueltas—, una condición que reduzca el trabajo pendiente y seguimiento de @@ROWCOUNT.
No debe improvisarse sobre producción: un ciclo de lotes mal definido puede repetir filas, omitirlas o competir indefinidamente con otros procesos.
Qué conviene comprobar
Antes de escribir un WHILE, preguntamos si un solo INSERT, UPDATE, DELETE, CTE o función de ventana puede resolver el conjunto. Una solución declarativa expresa el resultado buscado sin indicar un recorrido fila por fila. Suele ser más clara y ofrece más opciones al optimizador, el componente que compara estrategias de ejecución.
Cuando el ciclo sí es necesario, hacemos visible su salida, establecemos límites y medimos cada vuelta. También evitamos mantener una transacción abierta durante todo un proceso largo sin evaluar su impacto.