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
ステートメントの実行は、ループ内から、およびCONTINUE
キーワードをBREAK
使用して制御できます。
構文
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
わけではありません。 詳細については、「フロー制御」を参照してください。
解説
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