適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Microsoft Fabric の SQL 分析エンドポイント
Microsoft Fabric のウェアハウス
Microsoft Fabric の SQL データベース
SQL ステートメントまたはステートメント ブロックを繰り返し実行するための条件を設定します。 指定した条件が true の場合に限り、ステートメントは繰り返し実行します。
WHILE ループ内のステートメントの実行は、BREAKキーワードとCONTINUEキーワードを使用して、ループ内から制御できます。
Syntax
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 }
Arguments
boolean_expression
またはTRUEを返すFALSE。 ブール式に SELECT ステートメントが含まれている場合は、 SELECT ステートメントをかっこで囲む必要があります。
{ sql_statement | statement_block }
ステートメント ブロックで定義されている Transact-SQL ステートメントまたはステートメント グループ。 ステートメント ブロックを定義するには、フロー制御キーワード BEGIN と ENDを使用します。
BREAK
最も内側の WHILE ループから終了します。 ループの終わりを示す、 END キーワードの後に表示されるステートメントが実行されます。
CONTINUE
WHILE ループを再起動します。
CONTINUE キーワードの後のステートメントはすべて無視されます。
CONTINUE は、 IF テストによって頻繁に開かれますが、常に開かれるわけではありません。 詳細については、「 フロー制御」を参照してください。
Remarks
2 つ以上の WHILE ループが入れ子になっている場合、内部 BREAK は次の最も外側のループに終了します。 まず、この内側ループの終了の後にあるステートメントがすべて実行され、次にこの外側のループの実行が再開されます。
Examples
この記事のコード サンプルでは、AdventureWorks2025 または 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