WHILE (Transact-SQL)
适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库
设置重复执行 SQL 语句或语句块的条件。 只要指定的条件为真,就重复执行语句。 循环中的语句的执行可以通过循环内部WHILE
使用BREAK
和CONTINUE
关键字 (keyword)进行控制。
语法
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 }
注意
若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档。
参数
boolean_expression
返回TRUE
或 FALSE
. 如果布尔表达式包含语句 SELECT
,则必须将 SELECT
语句括在括号中。
{ sql_statement | statement_block }
使用语句块定义的任何 Transact-SQL 语句或语句分组。 若要定义语句块,请使用流控制关键字 (keyword)BEGIN
和 END
。
BREAK
导致从最 WHILE
内部循环退出。 执行在关键字 (keyword)之后END
显示的任何语句(标记循环的末尾)。
CONTINUE
WHILE
重启循环。 忽略关键字 (keyword)后CONTINUE
的任何语句。 CONTINUE
经常(但并非总是)由测试 IF
打开。 有关详细信息,请参阅 Flow 控制。
注解
如果嵌套了两个或多个 WHILE
循环,则内部 BREAK
将退出到下一个最外部的循环。 将首先运行内层循环结束之后的所有语句,然后重新开始下一个外层循环。
示例
本文中的 Transact-SQL 代码示例使用 AdventureWorks2022
示例数据库,可从 Microsoft SQL Server 示例和社区项目主页下载它。
A. 对嵌套 IF 使用 BREAK 和 CONTINUE...EL标准版 和 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
相关内容
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈