WHILE(Transact-SQL)
SQL 문 또는 문 블록의 반복 실행을 위한 조건을 설정합니다. 문은 지정된 조건이 true인 한 반복적으로 실행됩니다. WHILE 루프 내의 문 실행은 BREAK와 CONTINUE 키워드를 사용하여 루프 내에서 제어할 수 있습니다.
구문
WHILE Boolean_expression
{ sql_statement | statement_block | BREAK | CONTINUE }
인수
Boolean_expression
TRUE 또는 FALSE를 반환하는 식입니다. 부울 식에 SELECT 문이 포함된 경우에는 SELECT 문을 괄호로 묶어야 합니다.{sql_statement | statement_block}
문 블록에 정의된 Transact-SQL 문이나 문 그룹입니다. 문 블록을 정의하려면 흐름 제어 키워드인 BEGIN 및 END를 사용하십시오.BREAK
현재 위치에 해당하는 WHILE 루프를 종료합니다. 루프의 끝을 표시하는 END 키워드 다음에 있는 모든 문은 그대로 실행됩니다.CONTINUE
CONTINUE 키워드 다음의 모든 문을 무시하고 WHILE 루프가 다시 시작되도록 합니다.
주의
둘 이상의 WHILE 루프가 중첩된 경우 내부 루프에 BREAK가 있으면 현재 루프를 종료하고 한 단계 바깥쪽 루프로 이동합니다. 먼저 내부 루프의 끝 이후에 있는 모든 문이 실행된 다음 바깥쪽 루프가 다시 시작됩니다.
예
1.중첩된 IF...ELSE 및 WHILE에서 BREAK 및 CONTINUE 사용
다음 예에서는 제품의 평균 정가가 $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';
2.커서에 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