티스토리 뷰

728x90

과거 MSSQL에서 페이징 처리를 하는 방법은 ROW_NUMBER()를 사용한 방법이었다.

페이지에 출력되어야 하는 순서를 ROW_NUMBER() 함수를 사용하여 재정렬한 뒤 페이지 번호에 맞게 처리한다.

USE UserLabs
Go
/*
######################################
 UserLabs.DBO.USP_LST_EMPLOYEE_OLD 1
 UserLabs.DBO.USP_LST_EMPLOYEE_OLD 2
 UserLabs.DBO.USP_LST_EMPLOYEE_OLD 5
######################################
*/
ALTER PROCEDURE DBO.USP_LST_EMPLOYEE_OLD (
	@PAGENO INT	--페이지번호
)
AS
BEGIN
	DECLARE @PAGESIZE INT = 10	--한 페이지에 출력될 ROW

	;WITH PAGETBL AS (
		SELECT ROW_NUMBER() OVER(ORDER BY BusinessEntityID DESC) ROWNUM, *
		FROM AdventureWorks2014.HumanResources.Employee
	)
	SELECT *
	FROM PAGETBL
	WHERE ROWNUM BETWEEN (@PAGENO-1)*(@PAGESIZE+1) AND @PAGENO*@PAGESIZE
END

SQL SERVER 2012부터는 OFFSET FETCH 구문을 제공한다.

참고로 아래 SQL은 동일한 결과를 출력한다.

즉, TOP 10을 불러올 때와 OFFSET 0 이후 (1이 된다) 10개의 ROW를 FETCH하는 구문은 동일하다.

SELECT TOP 10 * 
FROM AdventureWorks2014.HumanResources.Employee
ORDER BY BusinessEntityID

SELECT * 
FROM AdventureWorks2014.HumanResources.Employee
ORDER BY BusinessEntityID
OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY;

이러한 OFFSET FETCH 구문을 활용하면 페이징 처리가 가능하다.

USE UserLabs
Go
/*
######################################
 UserLabs.DBO.USP_LST_EMPLOYEE 1
 UserLabs.DBO.USP_LST_EMPLOYEE 2
 UserLabs.DBO.USP_LST_EMPLOYEE 5
######################################
*/
ALTER PROCEDURE DBO.USP_LST_EMPLOYEE (
	@PAGENO INT	--페이지번호
)
AS
BEGIN
	DECLARE @PAGESIZE INT = 10	--한 페이지에 출력될 ROW

	SELECT * 
	FROM AdventureWorks2014.HumanResources.Employee
	ORDER BY BusinessEntityID
	OFFSET (@PAGENO-1) * @PAGESIZE ROWS
	FETCH NEXT @PAGESIZE ROWS ONLY;

END
728x90
LIST
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함