Usar WHILE...BREAK o CONTINUE

La instrucción WHILE repite una instrucción o bloque de instrucciones mientras la condición especificada siga siendo verdadera.

Se suelen utilizar dos instrucciones de Transact-SQL con WHILE: BREAK o CONTINUE. La instrucción BREAK sale del bucle WHILE más profundo, y la instrucción CONTINUE reinicia un bucle WHILE. Un programa podría ejecutar una instrucción BREAK si, por ejemplo, no hubiera más filas que procesar. Una instrucción CONTINUE podría ejecutarse si, por ejemplo, la ejecución del código debiera continuar.

Nota

Si una instrucción SELECT se usa como condición de la instrucción WHILE, la instrucción SELECT debe ir entre paréntesis.

Ejemplos

A. Usar WHILE en un cursor

En el ejemplo siguiente se usa una instrucción WHILE para controlar el número de capturas realizadas.

USE AdventureWorks2008R2;
GO
DECLARE abc CURSOR FOR
SELECT * FROM Purchasing.ShipMethod;
OPEN abc;
FETCH NEXT FROM abc
WHILE (@@FETCH_STATUS = 0)
   FETCH NEXT FROM abc;
CLOSE abc;
DEALLOCATE abc;
GO

Otras pruebas válidas de la condición WHILE podrían ser las siguientes:

WHILE (@ACounterVariable < 100)

O bien

WHILE EXISTS(SELECT LastName FROM Person.Person WHERE FirstName = N'Anne')

B. Utilizar BREAK y CONTINUE con IF…ELSE y WHILE anidados

En el ejemplo siguiente, si el precio de venta promedio de un producto es inferior a $300, el bucle WHILE dobla los precios y, a continuación, selecciona el precio máximo. Si el precio máximo es menor o igual que $500, el bucle WHILE se reinicia y vuelve a doblar los precios. Este bucle continúa doblando los precios hasta que el precio máximo es mayor que $500, después de lo cual sale del bucle WHILE e imprime un mensaje.

USE AdventureWorks2008R2;
GO
WHILE (SELECT AVG(ListPrice) FROM Production.Product) < $300
BEGIN
   UPDATE Production.Product
      SET ListPrice = ListPrice * 2
   SELECT MAX(ListPrice) FROM Production.Product
   IF (SELECT MAX(ListPrice) FROM Production.Product) > $500
      BREAK
   ELSE
      CONTINUE
END
PRINT 'Too much for the market to bear';