WHILE (Transact-SQL)
适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric 中的 SQL 终结点 Microsoft Fabric 中的仓库 Microsoft Fabric SQL 数据库
设置 SQL 语句或语句块重复执行的条件。 只要指定的条件为真,就重复执行语句。 循环中的 WHILE
语句的执行可以通过带 BREAK
关键字 CONTINUE
的循环内部进行控制。
语法
SQL Server、Azure SQL 数据库、Azure SQL 托管实例 和 Microsoft Fabric 的语法。
WHILE boolean_expression
{ sql_statement | statement_block | BREAK | CONTINUE }
Azure Synapse Analytics 和分析平台系统的语法(PDW)。
WHILE boolean_expression
{ sql_statement | statement_block | BREAK }
参数
boolean_expression
返回TRUE
或 FALSE
. 如果布尔表达式包含语句 SELECT
,则必须将 SELECT
语句括在括号中。
{ sql_statement | statement_block }
使用语句块定义的任何 Transact-SQL 语句或语句分组。 若要定义语句块,请使用流控制关键字 BEGIN
和 END
。
BREAK
导致从最 WHILE
内部循环退出。 执行关键字后 END
显示的任何语句(标记循环的末尾)。
CONTINUE
WHILE
重启循环。 忽略关键字后 CONTINUE
的任何语句。 CONTINUE
经常(但并非总是)由测试 IF
打开。 有关详细信息,请参阅 Flow 控制。
注解
如果嵌套了两个或多个 WHILE
循环,则内部 BREAK
将退出到下一个最外部的循环。 将首先运行内层循环结束之后的所有语句,然后重新开始下一个外层循环。
示例
本文中的 Transact-SQL 代码示例使用 AdventureWorks2022
或 AdventureWorksDW2022
示例数据库,可从 Microsoft SQL Server 示例和社区项目主页下载它。
A. 对嵌套 IF 使用 BREAK 和 CONTINUE...ELSE 和 WHILE
在以下示例中,如果产品的平均价格低于 300 美元,则 WHILE
循环将价格翻倍,然后选择最高价格。 如果最高价格小于或等于 500 美元,循环 WHILE
将重启并再次将价格翻倍。 此循环继续将价格翻倍,直到最高价格大于 500 美元,然后退出 WHILE
循环并输出消息。
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. 在游标中使用 WHILE
以下示例使用 @@FETCH_STATUS
来控制 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
示例:Azure Synapse Analytics 和 Analytics Platform System (PDW)
C:WHILE 循环
在以下示例中,如果产品的平均价格低于 300 美元,则 WHILE
循环将价格翻倍,然后选择最高价格。 如果最高价格小于或等于 500 美元,循环 WHILE
将重启并再次将价格翻倍。 此循环继续将价格翻倍,直到最高价格大于 500 美元,然后退出 WHILE
循环。
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