Applies to:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL analytics endpoint in Microsoft Fabric
Warehouse in Microsoft Fabric
SQL database in Microsoft Fabric
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
An expression that returns TRUE
or FALSE
. ブール式に SELECT
ステートメントが含まれている場合は、 SELECT
ステートメントをかっこで囲む必要があります。
{ sql_statement | statement_block }
ステートメント ブロックで定義されている Transact-SQL ステートメントまたはステートメント グループ。 ステートメント ブロックを定義するには、フロー制御キーワード BEGIN
と END
を使用します。
BREAK
最も内側の WHILE
ループから終了します。 ループの終わりを示す、 END
キーワードの後に表示されるステートメントが実行されます。
CONTINUE
WHILE
ループを再起動します。
CONTINUE
キーワードの後のステートメントはすべて無視されます。
CONTINUE
は、 IF
テストによって頻繁に開かれますが、常に開かれるわけではありません。 For more information, see Control-of-Flow.
Remarks
2 つ以上の WHILE
ループが入れ子になっている場合、内部 BREAK
は次の最も外側のループに終了します。 まず、この内側ループの終了の後にあるステートメントがすべて実行され、次にこの外側のループの実行が再開されます。
Examples
この記事のコード サンプルでは、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 loop
次の例では、製品の平均定価が $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