Transact-SQL 구문 표기 규칙
구문
------------------------------------------------------------------------------------------
WHILE Boolean_expression
{ sql_statement | statement_block }
[ BREAK ]
{ sql_statement | statement_block }
[ CONTINUE ]
{ sql_statement | statement_block }
------------------------------------------------------------------------------------------
주의
둘 이상의 WHILE 루프가 중첩된 경우, 내부 루프에 BREAK가 있으면 현재 루프를 종료하고 한 단계 바깥쪽 루프로 이동합니다. 먼저 내부 루프의 끝 이후에 있는 모든 문이 실행된 다음 바깥쪽 루프가 다시 시작됩니다.
인수
Boolean_expression
TRUE 또는 FALSE를 반환하는 식입니다. 부울 식에 SELECT 문이 포함된 경우에는 SELECT 문을 괄호로 묶어야 합니다.
{sql_statement | statement_block}
문 블록에 정의된 Transact-SQL 문이나 문 그룹입니다. 문 블록을 정의하려면 흐름 제어 키워드인 BEGIN 및 END를 사용하십시오.
BREAK
현재 위치에 해당하는 WHILE 루프를 종료합니다. 루프의 끝을 표시하는 END 키워드 다음에 있는 모든 문은 그대로 실행됩니다.
CONTINUE
CONTINUE 키워드 다음의 모든 문을 무시하고 WHILE 루프가 다시 시작되도록 합니다.
예
1. 중첩된 IF...ELSE 및 WHILE에서 BREAK 및 CONTINUE 사용
다음 예에서는 제품의 평균 정가가 $300 미만인 경우 WHILE 루프가 가격을 두 배로 한 다음 최대 가격을 선택합니다. 최대 가격이 $500 이하인 경우 WHILE 루프가 다시 시작되어 가격을 다시 두 배로 만듭니다. 이 루프는 최대 가격이 $500를 초과할 때까지 가격을 계속 두 배로 만든 다음 WHILE 루프를 종료하고 메시지를 출력합니다.
------------------------------------------------------------------------------------------
USE AdventureWorks;
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 사용
다음 WHILE 구문은 AdventureWorks 데이터베이스에 있는 모든 테이블의 행 개수를 반환합니다. WHILE 구문은 커서와 함께 사용되는 @@FETCH_STATUS 함수의 반환 값을 테스트합니다. @@FETCH_STATUS는 -2, -1 또는 0을 반환할 수 있기 때문에 3가지 경우를 모두 테스트해야 합니다. 쿼리가 실행된 이후에 커서 결과로부터 행을 삭제한 경우에는 해당 행을 건너뜁니다. 성공적으로 인출(0)된 경우 BEGIN...END 루프 내의 SELECT가 실행됩니다.
------------------------------------------------------------------------------------------
USE AdventureWorks;
GO
DECLARE tnames_cursor CURSOR
FOR
SELECT s.name + '.' + t.name
FROM sys.tables AS t
JOIN sys.schemas AS s ON s.schema_id = t.schema_id;
OPEN tnames_cursor;
DECLARE @tablename sysname;
FETCH NEXT FROM tnames_cursor INTO @tablename;
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
BEGIN
SELECT @tablename = RTRIM(@tablename);
EXEC ('SELECT ''' + @tablename + ''' = count(*) FROM '
+ @tablename );
PRINT ' ';
END;
FETCH NEXT FROM tnames_cursor INTO @tablename;
END;
CLOSE tnames_cursor;
DEALLOCATE tnames_cursor;
------------------------------------------------------------------------------------------
Posted by 홍반장