Share via


WHILE (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウス

SQL ステートメントまたはステートメント ブロックの実行を繰り返すための条件を設定します。 指定した条件が true の場合に限り、ステートメントは繰り返し実行します。 ループ内のWHILEステートメントの実行は、ループ内から、およびCONTINUEキーワード (keyword)を使用してBREAK制御できます。

Transact-SQL 構文表記規則

構文

SQL Server、Azure SQL Database、Azure SQL Managed Instance、および Microsoft Fabric の構文。

WHILE boolean_expression
    { sql_statement | statement_block | BREAK | CONTINUE }

Azure Synapse Analytics および Analytics Platform System (PDW) の構文。

WHILE boolean_expression
    { sql_statement | statement_block | BREAK }

Note

SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

引数

boolean_expression

返すTRUEFALSE ブール式にステートメントが SELECT 含まれている場合は、ステートメントを SELECT かっこで囲む必要があります。

{ sql_statement | statement_block }

ステートメント ブロックで定義されている Transact-SQL ステートメントまたはステートメント グループ。 ステートメント ブロックを定義するには、フロー制御キーワード (keyword)と BEGINEND.

BREAK

最も内側 WHILE のループから終了します。 ループの終わりをEND示すキーワード (keyword)の後に表示されるすべてのステートメントが実行されます。

CONTINUE

ループを WHILE 再起動します。 キーワード (keyword)の後のCONTINUEステートメントはすべて無視されます。 CONTINUE はテストによって頻繁に開かれますが、必ずしも開かれる IF わけではありません。 詳細については、「フロー制御」を参照してください

解説

2 つ以上 WHILE のループが入れ子になっている場合、内部 BREAK は次の最も外側のループに終了します。 まず、この内側ループの終了の後にあるステートメントがすべて実行され、次にこの外側のループの実行が再開されます。

この記事の Transact-SQL コード サンプルは AdventureWorks2022 サンプル データベースを使用します。このサンプル データベースは、Microsoft SQL Server サンプルとコミュニティ プロジェクトのホーム ページからダウンロードできます。

A. 入れ子になった IF で BREAK と CONTINUE を使用します...EL Standard Edition WHILE

次の例では、製品の平均定価が $300 未満の場合、 WHILE ループによって価格が 2 倍になり、最大価格が選択されます。 最大価格が $500 以下の場合、ループが WHILE 再起動し、価格が再び 2 倍になります。 このループは、最大価格が $500 を超えるまで価格を 2 倍にし続け、ループを 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 ループによって価格が 2 倍になり、最大価格が選択されます。 最大価格が $500 以下の場合、ループが WHILE 再起動し、価格が再び 2 倍になります。 このループは、最大価格が $ 500を超えるまで価格を2倍にし続け、ループを 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