DECLARE @i int
DECLARE @Result Int
DECLARE @Count int
DECLARE @Loop int
DECLARE @STR VARCHAR(4096)
DECLARE @SBlock int
DECLARE @C int
DECLARE @Start int
DECLARE @goto int
DECLARE @idx int
DECLARE @Current_Page int
DECLARE @Current_pages int
DECLARE @Page_Size int
DECLARE @Total int
DECLARE @Max_Size int
SET @STR = ''
SET @i = 0
SET @Page_Size = <페이지크기> -- 한페이지 당 크기
SET @Current_page = <현재페이지> -- 현재 페이지 번호
SET @Current_Pages = (@Current_page) * @Page_Size -- 현재 페이지의 실질적인 순서 번호
SET @Max_Size = <블럭크기> -- 1 Block 크기(10000)
SET @Start = 0 -- OLD 초기화
SELECT @Result = MAX(idx) FROM [<테이블이름>] WHERE master= 0 <옵션> -- 마지막 Idx번호
SELECT @Total = COUNT(idx) FROM [<테이블이름>] WHERE master = 0 <옵션> -- 전체 레코드
SET @Start = @Result -- 처음 시작 Index 레코드 번호
IF @Total > 0 -- 자료가 있어야많
BEGIN
IF @Current_Pages > @Max_Size -- 1 Block 이상인경우 만
BEGIN
SET @Loop = (@Total / @Max_Size) -- 전체 Block 에서 반복할 횟수
IF (@Total / @Max_Size) > 0 -- 추가 + 1
SET @Loop = @Loop + 1
WHILE @i <= @Loop -- 반복 함.
BEGIN
SET @Start = @Result -- 처음 시작 Index 레코드 번호
SET @SBlock = @Max_Size * @i
SELECT @Result = MIN(idx) FROM (SELECT TOP <블럭크기> idx FROM [<테이블이름>] WHERE idx < @Result AND master = 0 <옵션>) AS A
IF (@SBlock <= @Current_Pages AND @Current_Pages <= @SBlock + @Max_Size)
BEGIN
--SET @Start = @Result
--PRINT 'Find Current_Pages:('+LTRIM(STR(@Current_Pages)) + ') Page:('+LTRIM(STR(@SBlock)) + ') Start:('+LTRIM(STR(@Start))+')'+ ') Result:('+LTRIM(STR(@Result))+')'
BREAK
END
--PRINT 'Pass Current_Pages:('+LTRIM(STR(@Current_Pages)) + ') Page:('+LTRIM(STR(@SBlock)) + ') Start:('+LTRIM(STR(@Start))+')'
SET @i = @i + 1
END
END
--PRINT '---------------------------------------------------------------------------'
IF @Current_Pages > @Max_Size -- 1 Block 이상인경우 만
SET @goto = @Current_Pages - @SBlock - @Page_Size
ELSE
SET @goto = @Page_Size * @Current_page - @Page_Size -- 시작 순서 많큼 이동
--PRINT 'Start IDX: ' + LTRIM(STR(@Start)) + ' Goto: ' + LTRIM(STR(@goto))
DECLARE Cursor1 CURSOR SCROLL LOCAL KEYSET FOR SELECT TOP <블럭크기> idx FROM [<테이블이름>] WHERE idx <= @Start AND master = 0 <옵션> FOR READ ONLY
OPEN Cursor1
--PRINT @@CURSOR_ROWS -- 가져온 커서의 갯수
SET @i = 0
IF @goto > 0 -- 처음 위치 이면
BEGIN
SET @goto = @goto + 1 -- 0 + 1
FETCH ABSOLUTE @goto FROM Cursor1 INTO @Result -- 시작 위치 이동
END
ELSE
FETCH NEXT FROM Cursor1 INTO @Result -- 위치 이동
SET @Str = LTRIM(STR(@Result))
WHILE (@@FETCH_STATUS = 0 AND @i < @Page_Size -1) -- 검사
BEGIN
FETCH NEXT FROM Cursor1 INTO @Result -- 1개의 Idx 값을 가져 옮
SET @Str = @Str + ',' + LTRIM(STR(@Result)) -- 문자열에 추가
SET @i = @i + 1
END
--PRINT @str
CLOSE Cursor1
DEALLOCATE Cursor1
EXECUTE('SELECT * FROM [<테이블이름>] WHERE idx in('+@Str+') OR master in('+@Str+') ORDER BY idx DESC')
END
ELSE
SELECT * FROM [<테이블이름>] WHERE master = 0 <옵션>