티스토리 뷰

💼 정보 ver1.0

while 문

James Wetzel 2009. 5. 14. 10:11
728x90
반응형

WHILE

SQL 문 또는 문 차단의 반복 실행에 대한 조건을 설정합니다. 문은 지정된 조건이 true인 한, 반복적으로 실행됩니다. WHILE 루프의 문 실행은 BREAK와 CONTINUE 키워드를 사용하여 루프 내에서 제어할 수 있습니다.

구문

WHILE Boolean_expression
     { sql_statement | statement_block }
     [ BREAK ]
     { sql_statement | statement_block }
     [ CONTINUE ]

인수

Boolean_expression

TRUE 또는 FALSE를 반환하는 식입니다. 부울 식에 SELECT 문이 포함된 경우에는 SELECT 문을 괄호로 묶어야 합니다.

{ sql_statement | statement_block }

문 블록에 정의된 모든 Transact-SQL 문이나 문의 그룹입니다. 문 블록을 정의하려면 흐름 제어 키워드인 BEGIN 및 END를 사용하십시오.

BREAK

가장 안쪽의 WHILE 루프에서 종료하도록 합니다. 루프의 끝을 표시하는 END 키워드 다음에 표시되는 모든 문은 실행됩니다.

CONTINUE

CONTINUE 키워드 다음의 모든 문을 무시하고 WHILE 루프가 다시 시작되도록 합니다.

비고

둘 이상의 WHILE 루프가 중첩된 경우에는 내부 BREAK가 다음 바깥쪽 루프로 종료합니다. 먼저 내부 루프의 끝 다음의 모든 문이 실행된 이후에 다음 바깥쪽 루프가 다시 시작합니다.

예제
A. 중첩된 IF...ELSE 및 WHILE로 BREAK 및 CONTINUE 사용

다음은 평균 가격이 $30 미만인 경우, WHILE 루프가 가격을 두 배로 한 다음 최대 가격을 선택하는 예제입니다. 최대 가격이 $50 이하인 경우, WHILE 루프가 다시 시작되어 가격을 다시 두 배로 만듭니다. 이러한 루프는 최대 가격이 $50를 초과할 때까지 가격을 두 배로 만드는 것을 계속한 다음 WHILE 루프를 종료하고 메시지를 인쇄합니다.

USE pubs
GO
WHILE (SELECT AVG(price) FROM titles) < $30
BEGIN
   UPDATE titles
      SET price = price * 2
   SELECT MAX(price) FROM titles
   IF (SELECT MAX(price) FROM titles) > $50
      BREAK
   ELSE
      CONTINUE
END
PRINT 'Too much for the market to bear'
B. 커서가 있는 프로시저 내에서 WHILE 사용

다음 WHILE 생성은 count_all_rows라는 이름의 프로시저의 구역입니다. 다음은 이 WHILE 생성이 커서와 함께 사용되는 함수인 @@FETCH_STATUS의 반환 값을 테스트하는 예제입니다. @@FETCH_STATUS가 -2, -1 또는 0을 반환하므로 세 가지 경우를 모두 테스트해야 합니다. 저장 프로시저가 실행된 이후에 커서 결과로부터 행을 삭제한 경우에는 해당 행을 건너뜁니다. 성공적으로 반입(0)된 경우, BEGIN...END 루프 내의 SELECT가 실행됩니다.

USE pubs
DECLARE tnames_cursor CURSOR
FOR
   SELECT TABLE_NAME 
   FROM INFORMATION_SCHEMA.TABLES
OPEN tnames_cursor
DECLARE @tablename sysname
--SET @tablename = 'authors'
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

관련 항목

ALTER TRIGGER

흐름 제어 언어

CREATE TRIGGER

커서

SELECT

declare @count int
set @count = 0

while @count < 300
 begin
  select * from dbo.Orders
  set @count = @count +1
 end

728x90
반응형