WHILE (Transact-SQL)
SQL ステートメントまたはステートメント ブロックの実行を繰り返すための条件を設定します。 指定した条件が満たされている限り、ステートメントは繰り返し実行されます。 WHILE ループ内のステートメントの実行は、ループ内から BREAK キーワードおよび CONTINUE キーワードによって制御することができます。
構文
WHILE Boolean_expression
{ sql_statement | statement_block | BREAK | CONTINUE }
引数
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 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. カーソルで WHILE を使用する
次の例では、@@FETCH_STATUS を使用して WHILE ループ内のカーソルの動作を制御します。
DECLARE Employee_Cursor CURSOR FOR
SELECT EmployeeID, Title
FROM AdventureWorks2012.HumanResources.Employee
WHERE JobTitle = 'Marketing Specialist';
OPEN Employee_Cursor;
FETCH NEXT FROM Employee_Cursor;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM Employee_Cursor;
END;
CLOSE Employee_Cursor;
DEALLOCATE Employee_Cursor;
GO