WHILE (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库

设置重复执行 SQL 语句或语句块的条件。 只要指定的条件为真,就重复执行语句。 循环中的语句的执行可以通过循环内部WHILE使用BREAKCONTINUE关键字 (keyword)进行控制。

Transact-SQL 语法约定

语法

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

返回TRUEFALSE. 如果布尔表达式包含语句 SELECT ,则必须将 SELECT 语句括在括号中。

{ sql_statement | statement_block }

使用语句块定义的任何 Transact-SQL 语句或语句分组。 若要定义语句块,请使用流控制关键字 (keyword)BEGINEND

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