3초기억력

MS-SQL- Cursor 사용예제3 본문

쿼리_MSSQL

MS-SQL- Cursor 사용예제3

잠수콩 2010. 4. 6. 14:37




저장 프로시저내에서도 일반 프로그램처럼 While 문과 같은 루핑문장을 사용하고자 할 경우가 있다.
이는 일반적으로 단일 Row만을 검출해서 값을 비교할수 없는 여러 Row의 값이 출력되어야 할경우에 사용하게 된다.

이런경우 일반적으로 사용되는 방법은
1. Select 문을 통해서 레코드정보(A)를 얻는다.
2. ASP 페이지에서 WHILE(또는 LOOP)문을 통해서 A의 값을 순차적으로 루핑을 시키면서
3. INSERT, UPDATE 또는 기타 수행문을 실행한다.
4. A의 레코드를 닫는다.
의 순서로 진행되어진다.

하지만 이런경우 여러개의 쿼리들을 돌아다녀야하고, 수행 속도또한 웹페이지(웹서버)에 디펜던트 하기때문에 속도적으로 불리한면이 있다.
이를 보완하기위해서 다음과 같이 커서를 사용할수 있다.

DECLARE @scode int, @ecode int, @title varchar(300),
@icnt int, @spos int, @currSN int

set @spos = 100

DECLARE sn_cursor CURSOR
FOR
        SELECT sn
        FROM table_name with (readuncommitted)
        WHERE sn > 0
        AND (code >= @scode AND code <= @ecode)
        AND (title like '%'+@title+'%' or keyword like '%'+@title+'%' or content like '%'+@title+'%')
        ORDER BY sn desc
OPEN sn_cursor
FETCH NEXT FROM sn_cursor INTO @currSN
WHILE (@@FETCH_STATUS <> -1)
BEGIN
        IF (@@FETCH_STATUS <> -2)
        BEGIN
                IF @icnt > @spos
                        BREAK
                ELSE
                BEGIN
                        set @icnt = @icnt + 1
                        FETCH NEXT FROM sn_cursor INTO @currSN
                END
        END
END
CLOSE sn_cursor
DEALLOCATE sn_cursor

위의 쿼리는 `table_name`의 테이블로 부터 sn값을 추출하여 데이터가 존재하는 경우에(Not EOF(-1) 또는 No Error(-2)) @spos(100) 번째 로우가 출현했을때의 값을 @currSN 에 넣어주는 쿼리이다.

이 쿼리의 사용은 MS-SQL의 취약중에 하나일 rownum을 대치하기 위한 방법으로,
특정갯수의 row를 지나치고난 다음값을 리턴함으로 그 값부터의 top 20 Row를 추출하기 위해 사용하였다.
 
Comments