WHILE (Transact-SQL)WHILE (Transact-SQL)

適用対象: ○SQL Server ○Azure SQL Database ○Azure SQL Data Warehouse ○Parallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

SQL ステートメントまたはステートメント ブロックの実行を繰り返すための条件を設定します。Sets a condition for the repeated execution of an SQL statement or statement block. 指定した条件が true の場合に限り、ステートメントは繰り返し実行します。The statements are executed repeatedly as long as the specified condition is true. WHILE ループ内のステートメントの実行は、ループ内から BREAK キーワードおよび CONTINUE キーワードによって制御することができます。The execution of statements in the WHILE loop can be controlled from inside the loop with the BREAK and CONTINUE keywords.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

-- Syntax for SQL Server and Azure SQL Database  
  
WHILE Boolean_expression   
     { sql_statement | statement_block | BREAK | CONTINUE }  
  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  
  
WHILE Boolean_expression   
     { sql_statement | statement_block | BREAK }  
  

引数Arguments

Boolean_expressionBoolean_expression
TRUE または FALSE を返すです。Is an expression that returns TRUE or FALSE. ブール式が SELECT ステートメントを含む場合は、SELECT ステートメントをかっこで囲む必要があります。If the Boolean expression contains a SELECT statement, the SELECT statement must be enclosed in parentheses.

{sql_statement | statement_block}{sql_statement | statement_block}
1 つの Transact-SQLTransact-SQL ステートメント、またはステートメント ブロックとして定義した一連のステートメントです。Is any Transact-SQLTransact-SQL statement or statement grouping as defined with a statement block. ステートメント ブロックを定義するには、流れ制御キーワードの BEGIN と END を使用してください。To define a statement block, use the control-of-flow keywords BEGIN and END.

BREAKBREAK
最も内側の WHILE ループから抜けます。Causes an exit from the innermost WHILE loop. ループの終了位置を示す END キーワード以降のすべてのステートメントが実行されます。Any statements that appear after the END keyword, marking the end of the loop, are executed.

CONTINUECONTINUE
CONTINUE キーワード以降のすべてのステートメントを無視し、WHILE ループを再開します。Causes the WHILE loop to restart, ignoring any statements after the CONTINUE keyword.

RemarksRemarks

2 つ以上の WHILE ループを入れ子にする場合、内側の BREAK が終了すると、1 つ外側のループに出ます。If two or more WHILE loops are nested, the inner BREAK exits to the next outermost loop. まず、この内側ループの終了の後にあるステートメントがすべて実行され、次にこの外側のループの実行が再開されます。All the statements after the end of the inner loop run first, and then the next outermost loop restarts.

使用例Examples

A.A. BREAK と CONTINUE を、入れ子にされた IF...ELSE および WHILE と組み合わせて使用するUsing BREAK and CONTINUE with nested IF...ELSE and WHILE

次の例では、製品の平均表示価格が $300 を下回る場合、WHILE ループが価格を倍にして、最高価格を選択します。In the following example, if the average list price of a product is less than $300, the WHILE loop doubles the prices and then selects the maximum price. 最高価格が $500 以下の場合は、WHILE ループが再開し、再び価格を倍にします。If the maximum price is less than or equal to $500, the WHILE loop restarts and doubles the prices again. このループは、最高価格が $500 を超えるまで価格を倍増し続け、その後 WHILE ループから抜け出してメッセージを出力します。This loop continues doubling the prices until the maximum price is greater than $500, and then exits the WHILE loop and prints a message.

USE AdventureWorks2012;  
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.B. カーソルで WHILE を使用するUsing WHILE in a cursor

次の例では、@@FETCH_STATUS を使用して WHILE ループ内のカーソルの動作を制御します。The following example uses @@FETCH_STATUS to control cursor activities in a WHILE loop.

DECLARE @EmployeeID as nvarchar(256)
DECLARE @Title as nvarchar(50)

DECLARE Employee_Cursor CURSOR FOR  
SELECT LoginID, JobTitle   
FROM AdventureWorks2012.HumanResources.Employee  
WHERE JobTitle = 'Marketing Specialist';  
OPEN Employee_Cursor;  
FETCH NEXT FROM Employee_Cursor;  
FETCH NEXT FROM Employee_Cursor INTO @EmployeeID, @Title;  
WHILE @@FETCH_STATUS = 0  
   BEGIN  
      Print '   ' + @EmployeeID + '      '+  @Title 
      FETCH NEXT FROM Employee_Cursor;  
   END;  
CLOSE Employee_Cursor;  
DEALLOCATE Employee_Cursor;  
GO 

例: Azure SQL データ ウェアハウスAzure SQL Data Warehouse および Parallel Data WarehouseParallel Data WarehouseExamples: Azure SQL データ ウェアハウスAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

C: シンプルな While ループC: Simple While Loop

次の例では、製品の平均表示価格が $300 を下回る場合、WHILE ループが価格を倍にして、最高価格を選択します。In the following example, if the average list price of a product is less than $300, the WHILE loop doubles the prices and then selects the maximum price. 最高価格が $500 以下の場合は、WHILE ループが再開し、再び価格を倍にします。If the maximum price is less than or equal to $500, the WHILE loop restarts and doubles the prices again. このループは、最高価格が $500 を超えるまで価格を倍増し続け、その後 WHILE ループから抜け出します。This loop continues doubling the prices until the maximum price is greater than $500, and then exits the WHILE loop.

-- 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  
  

参照See Also

ALTER TRIGGER (Transact-SQL) ALTER TRIGGER (Transact-SQL)
フロー制御言語 (TRANSACT-SQL) Control-of-Flow Language (Transact-SQL)
CREATE TRIGGER (Transact-SQL) CREATE TRIGGER (Transact-SQL)
カーソル (Transact-SQL) Cursors (Transact-SQL)
SELECT (Transact-SQL)SELECT (Transact-SQL)