WHILE (Transact-SQL)
Se aplica a: punto de conexión de SQL Server
Azure SQL Database
Azure SQL Instancia administrada
punto de conexión de SQL Analytics Analytics Platform System (PDW) de SQL Analytics
System (PDW)
de SQL Server en Microsoft Fabric
Warehouse en Microsoft Fabric
Establece una condición para la ejecución repetida de una instrucción o bloque de instrucciones SQL. 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 }
Nota:
Para ver la sintaxis de Transact-SQL para SQL Server 2014 (12.x) y versiones anteriores, consulte Versiones anteriores de la documentación.
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