WHILE (Transact-SQL)
適用対象: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 キーワードによって制御することができます。
構文
-- Syntax for SQL Server and Azure SQL Database and Microsoft Fabric
WHILE Boolean_expression
{ sql_statement | statement_block | BREAK | CONTINUE }
-- Syntax for Azure Azure Synapse Analytics and Parallel Data Warehouse
WHILE Boolean_expression
{ sql_statement | statement_block | BREAK }
Note
SQL Server 2014 以前の Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。
引数
Boolean_expression
TRUE または FALSE を返す式です。 ブール式が SELECT ステートメントを含む場合は、SELECT ステートメントをかっこで囲む必要があります。
{sql_statement | statement_block}
1 つの Transact-SQL ステートメント、またはステートメント ブロックとして定義した一連のステートメントです。 ステートメント ブロックを定義するには、流れ制御キーワードの BEGIN と END を使用してください。
BREAK
最も内側の WHILE ループから抜けます。 ループの終了位置を示す END キーワード以降のすべてのステートメントが実行されます。
CONTINUE
CONTINUE キーワード以降のすべてのステートメントを無視し、WHILE ループを再開します。
注釈
2 つ以上の WHILE ループを入れ子にする場合、内側の BREAK が終了すると、1 つ外側のループに出ます。 まず、この内側ループの終了の後にあるステートメントがすべて実行され、次にこの外側のループの実行が再開されます。
例
A. BREAK と CONTINUE を、入れ子にされた IF...ELSE および WHILE と組み合わせて使用する
次の例では、製品の平均表示価格が $300
を下回る場合、WHILE
ループが価格を倍にして、最高価格を選択します。 最高価格が $500
以下の場合は、WHILE
ループが再開し、再び価格を倍にします。 このループは、最高価格が $500
を超えるまで価格を倍増し続け、その後 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
ループが価格を倍にして、最高価格を選択します。 最高価格が $500
以下の場合は、WHILE
ループが再開し、再び価格を倍にします。 このループは、最高価格が $500
を超えるまで価格を倍増し続け、その後 WHILE
ループから抜け出します。
-- Uses AdventureWorks
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
関連項目
ALTER TRIGGER (Transact-SQL)
フロー制御言語 (Transact-SQL)
CREATE TRIGGER (Transact-SQL)
カーソル (Transact-SQL)
SELECT (Transact-SQL)