次の方法で共有


WHILE (Transact-SQL)

適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric のSQL 分析エンドポイント Microsoft Fabric のウェアハウス

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

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

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

{ sql_statement | statement_block }

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

BREAK

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

CONTINUE

WHILE ループを再起動します。 CONTINUE キーワードの後のステートメントはすべて無視されます。 CONTINUE は、 IF テストによって頻繁に開かれますが、常に開かれるわけではありません。 詳細については、「 Control-of-Flow」を参照してください。

解説

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

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

A. 入れ子になった IF で BREAK と CONTINUE を使用します...ELSE と 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