title | description | author | ms.author | ms.date | ms.service | ms.subservice | ms.topic | ms.custom | f1_keywords | helpviewer_keywords | dev_langs | monikerRange | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
WHILE (Transact-SQL) |
WHILE sets a condition for the repeated execution of a SQL statement or statement block. |
rwestMSFT |
randolphwest |
05/10/2024 |
sql |
t-sql |
reference |
|
|
|
|
>=aps-pdw-2016 || =azuresqldb-current || =azure-sqldw-latest || >=sql-server-2016 || >=sql-server-linux-2017 || =azuresqldb-mi-current || =fabric |
[!INCLUDE sql-asdb-asdbmi-asa-pdw-fabricse-fabricdw-fabricsqldb]
Sets a condition for the repeated execution of a SQL statement or statement block. The statements are executed repeatedly as long as the specified condition is true. The execution of statements in the WHILE
loop can be controlled from inside the loop with the BREAK
and CONTINUE
keywords.
:::image type="icon" source="../../includes/media/topic-link-icon.svg" border="false"::: Transact-SQL syntax conventions
Syntax for SQL Server, Azure SQL Database, Azure SQL Managed Instance, and Microsoft Fabric.
WHILE boolean_expression
{ sql_statement | statement_block | BREAK | CONTINUE }
Syntax for Azure Synapse Analytics and Analytics Platform System (PDW).
WHILE boolean_expression
{ sql_statement | statement_block | BREAK }
An expression that returns TRUE
or FALSE
. If the Boolean expression contains a SELECT
statement, the SELECT
statement must be enclosed in parentheses.
Any [!INCLUDE tsql] statement or statement grouping as defined with a statement block. To define a statement block, use the control-of-flow keywords BEGIN
and END
.
Causes an exit from the innermost WHILE
loop. Any statements that appear after the END
keyword, marking the end of the loop, are executed.
Restarts a WHILE
loop. Any statements after the CONTINUE
keyword are ignored. CONTINUE
is frequently, but not always, opened by an IF
test. For more information, see Control-of-Flow.
If two or more WHILE
loops are nested, the inner BREAK
exits to the next outermost loop. All the statements after the end of the inner loop run first, and then the next outermost loop restarts.
[!INCLUDE article-uses-adventureworks]
In the following example, if the average list price of a product is less than $300, the WHILE
loop doubles the prices and then selects the maximum price. If the maximum price is less than or equal to $500, the WHILE
loop restarts and doubles the prices again. This loop continues doubling the prices until the maximum price is greater than $500, and then exits the WHILE
loop and prints a message.
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';
The following example uses @@FETCH_STATUS
to control cursor activities in a WHILE
loop.
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
Examples: [!INCLUDE ssazuresynapse-md] and [!INCLUDE ssPDW]
In the following example, if the average list price of a product is less than $300, the WHILE
loop doubles the prices and then selects the maximum price. If the maximum price is less than or equal to $500, the WHILE
loop restarts and doubles the prices again. This loop continues doubling the prices until the maximum price is greater than $500, and then exits the WHILE
loop.
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