分享方式:


WHILE (Transact-SQL)

適用於:Microsoft Fabric Microsoft網狀架構倉儲中的 SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW) SQL 分析端點

設定重複執行 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 程式代碼範例會使用 AdventureWorks2022AdventureWorksDW2022 範例資料庫,您可以從 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