WHILE (Transact-SQL)

Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Punto de conexión de análisis SQL en Microsoft Fabric Almacenamiento en Microsoft Fabric

Establece una condición para la ejecución repetida de una instrucción SQL o bloque de instrucciones. Las instrucciones se ejecutan repetidamente siempre que la condición especificada sea verdadera. La ejecución de instrucciones en el WHILE bucle se puede controlar desde dentro del bucle con las palabras BREAK clave y CONTINUE .

Convenciones de sintaxis de Transact-SQL

Sintaxis

Sintaxis para SQL Server, Azure SQL Database, Azure SQL Instancia administrada y Microsoft Fabric.

WHILE boolean_expression
    { sql_statement | statement_block | BREAK | CONTINUE }

Sintaxis de Azure Synapse Analytics and Analytics Platform System (PDW).

WHILE boolean_expression
    { sql_statement | statement_block | BREAK }

Argumentos

boolean_expression

Expresión que devuelve TRUE o FALSE. Si la expresión booleana contiene una SELECT instrucción , la SELECT instrucción debe incluirse entre paréntesis.

{ sql_statement | statement_block }

Cualquier instrucción transact-SQL o agrupación de instrucciones tal como se define con un bloque de instrucciones. Para definir un bloque de instrucciones, use las palabras clave BEGIN control-of-flow y END.

BREAK

Provoca una salida del bucle más WHILE interno. Las instrucciones que aparecen después de la END palabra clave , que marcan el final del bucle, se ejecutan.

CONTINUE

Reinicia un WHILE bucle. Se omiten todas las instrucciones después de la CONTINUE palabra clave . CONTINUE es frecuente, pero no siempre, abierto por una IF prueba. Para obtener más información, consulte Control de flujo.

Comentarios

Si se anidan dos o más WHILE bucles, el interior BREAK sale al siguiente bucle más externo. Todas las instrucciones que se encuentran después del final del bucle interno deben ejecutarse primero y después se reinicia el siguiente bucle más externo.

Ejemplos

Los ejemplos de código de Transact-SQL de este artículo utilizan la base de datos de ejemplo AdventureWorks2022 o AdventureWorksDW2022, que se pueden descargar desde la página principal de Ejemplos y proyectos de la comunidad de Microsoft SQL Server.

A Use BREAK y CONTINUE con IF anidado... ELSE y WHILE

En el ejemplo siguiente, si el precio medio de la lista de un producto es inferior a 300 USD, el WHILE bucle duplica los precios y, a continuación, selecciona el precio máximo. Si el precio máximo es menor o igual que $500, el WHILE bucle se reinicia y vuelve a duplicar los precios. Este bucle continúa duplicando los precios hasta que el precio máximo es mayor que $500 y, a continuación, sale del WHILE bucle e imprime un mensaje.

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

B. Usar WHILE en un cursor

En el ejemplo siguiente se usa @@FETCH_STATUS para controlar las actividades del cursor en un bucle WHILE.

DECLARE @EmployeeID AS NVARCHAR(256)
DECLARE @Title AS NVARCHAR(50)

DECLARE Employee_Cursor CURSOR
FOR
SELECT LoginID,
    JobTitle
FROM AdventureWorks2022.HumanResources.Employee
WHERE JobTitle = 'Marketing Specialist';

OPEN Employee_Cursor;

FETCH NEXT
FROM Employee_Cursor
INTO @EmployeeID,
    @Title;

WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT '   ' + @EmployeeID + '      ' + @Title

    FETCH NEXT
    FROM Employee_Cursor
    INTO @EmployeeID,
        @Title;
END;

CLOSE Employee_Cursor;

DEALLOCATE Employee_Cursor;
GO

Ejemplos: Azure Synapse Analytics y Sistema de la plataforma de análisis (PDW)

C: bucle WHILE

En el ejemplo siguiente, si el precio medio de la lista de un producto es inferior a 300 USD, el WHILE bucle duplica los precios y, a continuación, selecciona el precio máximo. Si el precio máximo es menor o igual que $500, el WHILE bucle se reinicia y vuelve a duplicar los precios. Este bucle continúa duplicando los precios hasta que el precio máximo sea mayor que $500 y, a continuación, sale del WHILE bucle.

WHILE (
        SELECT AVG(ListPrice)
        FROM dbo.DimProduct
        ) < $300
BEGIN
    UPDATE dbo.DimProduct
    SET ListPrice = ListPrice * 2;

    SELECT MAX(ListPrice)
    FROM dbo.DimProduct

    IF (
            SELECT MAX(ListPrice)
            FROM dbo.DimProduct
            ) > $500
        BREAK;
END