同时(Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsMicrosoft Fabric中的SQL分析端点Microsoft Fabric中的仓库Microsoft Fabric中的SQL数据库

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

Transact-SQL 语法约定

Syntax

SQL Server、Azure SQL 数据库、Azure SQL 托管实例 和 Microsoft Fabric 的语法。

WHILE boolean_expression
    { sql_statement | statement_block | BREAK | CONTINUE }

Syntax for Azure Synapse Analytics.

WHILE boolean_expression
    { sql_statement | statement_block | BREAK }

Arguments

boolean_expression

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

{ sql_statementstatement_block }

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

BREAK

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

CONTINUE

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

Remarks

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

Examples

本文中的代码示例使用AdventureWorks2025了 、 AdventureWorksDW2025或AdventureWorksLT2025示例数据库,您可以从 Azure Data SQL Samples Repository 的 GitHub 仓库下载。

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

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