次の方法で共有


WHILE (Transact-SQL)

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

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 }

引数

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