SQL 프로시저를 생성하는 도중에 페이징이 너무 와닿지가 않았다.
공부를 많이 안했다는 증거... -_-;
자료를 찾아뒤지던 중.
아주 좋은 페이징기법인 CTE (Common Table Expression) 라는 아주 좋은 녀석을 발견했다.
마침 회사디비는 SQL 2005를 사용하고 있는터라, 매우 유용하게 사용될 듯 싶다.
1. top 키워드 이용 페이징
create procedure [dbo].[PaymentList1]
@page int,
@pageSize int
as
BEGIN
select top (@pageSize)
execDate, paymentID
from tblPayment
where paymentID not in (
select top ((@page - 1) * @pageSize) paymentID
from tblPayment
ORDER BY paymentID desc
)
ORDER BY paymentID desc
end
2. RowCount 키워드 이용 페이징
create procedure [dbo].[PaymentList2]
@page int,
@pageSize int
as
BEGIN
DECLARE @N1 INT, @N2 INT
declare @lastIndex int
set @N1 = ((@page - 1) * @pageSize)
set @N2 = @pageSize
SET ROWCOUNT @N1
select
@lastIndex = paymentID -- 마지막 로우에서 반환된 값을 임시 저장합니다
from tblPayment
ORDER BY paymentID desc
SETROWCOUNT @N2
select
execDate, paymentID
from tblPayment
where paymentID < @lastIndex
ORDER BY paymentID desc
end
여기까지는 MS-SQL 2000에서 보편적으로 사용하던 방식입니다.
MS-SQL 2005에는 Row_Number와 CTE(Common Table Expression)을 이용하여 간편하게 페이지을 할 수 있습니다.
3. Row_Number, CTE 이용 페이징
alter procedure [dbo].[PaymentList3]
@page int,
@pageSize int
as
BEGIN
with paymentListTBL as
(
select Row_Number() OVER (ORDER BY paymentID desc) AS rowNum,
execDate, paymentID
from
tblPayment
)
select * from paymentListTBL
where rowNum between ((@page - 1) * @pageSize) + 1 and @page * @pageSize
end