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
キーワードを使用して、ループ内から制御できます。
構文
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 ステートメントまたはステートメント グループ。 ステートメント ブロックを定義するには、フロー制御キーワード BEGIN
と END
を使用します。
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