WHILE (Transact-SQL)

适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics 分析平台系统 (PDW) Microsoft Fabric 中的 SQL 分析端点 Microsoft Fabric 中的仓库

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

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 }

参数

boolean_expression

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

{ sql_statement | statement_block }

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

BREAK

导致从最 WHILE 内部循环退出。 执行关键字后 END 显示的任何语句(标记循环的末尾)。

CONTINUE

WHILE重启循环。 忽略关键字后 CONTINUE 的任何语句。 CONTINUE 经常(但并非总是)由测试 IF 打开。 有关详细信息,请参阅 Flow 控制

注解

如果嵌套了两个或多个 WHILE 循环,则内部 BREAK 将退出到下一个最外部的循环。 将首先运行内层循环结束之后的所有语句,然后重新开始下一个外层循环。

示例

本文中的 Transact-SQL 代码示例使用 AdventureWorks2022AdventureWorksDW2022 示例数据库,可从 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