Share via


WHILE (Transact-SQL)

適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 分析端點Microsoft Fabric 中的倉儲

設定重複執行 SQL 陳述式或陳述式區塊的條件。 只要符合指定的條件,就會重複執行這些陳述式。 迴圈中的 WHILE 語句執行可以從 迴圈內使用 BREAKCONTINUE 關鍵詞來控制。

Transact-SQL 語法慣例

Syntax

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

回 或FALSETRUE表達式。 如果布爾表達式包含 SELECT 語句, SELECT 語句必須以括弧括住。

{ sql_statement | statement_block }

使用語句區塊所定義的任何 Transact-SQL 語句或語句群組。 若要定義語句區塊,請使用流程控制關鍵字 BEGINEND

BREAK

導致最 WHILE 內部循環的結束。 會執行在 關鍵詞後面 END 顯示的任何語句,標示循環結尾。

CONTINUE

WHILE重新啟動迴圈。 忽略 關鍵詞之後 CONTINUE 的任何語句。 CONTINUE 經常會由測試開啟,但不一定會開啟 IF 。 如需詳細資訊,請參閱 流程控制。

備註

如果巢狀兩個或多個 WHILE 循環,內部 BREAK 會結束至下一個最外層迴圈。 內層迴圈尾端之後的所有陳述式會先執行,然後重新啟動下一個最外層迴圈。

範例

本文 Transact-SQL 程式碼範例使用 AdventureWorks2022 範例資料庫,從 Microsoft SQL Server Samples 和 Community Projects (Microsoft SQL Server 範例和社群專案)首頁即可下載。

A. 使用 BREAK 和 CONTINUE 搭配巢狀 IF...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