WHILE (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウス

SQL ステートメントまたはステートメント ブロックの実行を繰り返すための条件を設定します。 指定した条件が true の場合に限り、ステートメントは繰り返し実行します。 WHILE ループ内のステートメントの実行は、ループ内から BREAK キーワードおよび CONTINUE キーワードによって制御することができます。

Transact-SQL 構文表記規則

構文

-- 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 (12.x) 以前のバージョンの 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)