WHILE (Transact-SQL)
Applies to: 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
キーワードを使用して、ループ内から制御できます。
構文
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