CREATE PROCEDURE dbo.up_PagingList (
 @strFields varchar(4000),     --조회대상 컬럼
 @strPK varchar(100),          --조회대상테이블의 PK
 @strTables varchar(4000),     --조회대상테이블(Join~on~문도 가능)
 @intPageNo int = 1,           --시작페이지
 @intPageSize int = NULL,      --페이지당 건수
 @blnGetRecordCount bit = 0,   --건수 반환여부
 @strFilter varchar(8000) = NULL, --조회조건절
 @strSort varchar(8000) = NULL,   --order by절
 @strGroup varchar(8000) = NULL)  --Group by절
/* 매개변수에 따라 반환되는 결과값을 특정 페이지로 정의하거나
   전체 행을 모두 반환할 수 있도록 설정한다. */
AS 

DECLARE @blnBringAllRecords bit
DECLARE @strPageNo varchar(50)
DECLARE @strPageSize varchar(50)
DECLARE @strSkippedRows varchar(50)
DECLARE @strFilterCriteria varchar(8000)
DECLARE @strSimpleFilter varchar(8000)
DECLARE @strSortCriteria varchar(8000)
DECLARE @strGroupCriteria varchar(8000)
DECLARE @intRecordcount int
DECLARE @intPagecount int

/* 페이징 조건 정규화 의미있는 페이징 조건이 입력되지 않은 경우,
   페이징하지 않고 좀 더 효율적인 방법으로 쿼리를 실행시키기 위해
   blnBringAllRecords 플래그를 사용 */
IF @intPageNo < 1 Begin
 SET @intPageNo = 1
End

SET @strPageNo = CONVERT(varchar(50), @intPageNo)
IF @intPageSize IS NULL OR @intPageSize < 1 -- 페이징하지 않고 전체 행을 반환
 SET @blnBringAllRecords = 1
ELSE
BEGIN
 SET @blnBringAllRecords = 0
 SET @strPageSize = CONVERT(varchar(50), @intPageSize)
 SET @strPageNo = CONVERT(varchar(50), @intPageNo)
 SET @strSkippedRows = CONVERT(varchar(50), @intPageSize * (@intPageNo - 1))
END
/* 정렬 및 필터링 조건 정규화 정렬 및 필터링 조건이 지정되지 않으면, 필터링이나 정렬작업이 수행되지 않
도록 하여 쿼리의 성능을 향상시킴.*/
IF @strFilter IS NOT NULL AND @strFilter != ''
BEGIN
 SET @strFilterCriteria = ' WHERE ' + @strFilter + ' '
 SET @strSimpleFilter = ' AND ' + @strFilter + ' '
END
ELSE
BEGIN
 SET @strSimpleFilter = ''
 SET @strFilterCriteria = ''
END
IF @strSort IS NOT NULL AND @strSort != ''
 SET @strSortCriteria = ' ORDER BY ' + @strSort + ' '
ELSE
 SET @strSortCriteria = ''
IF @strGroup IS NOT NULL AND @strGroup != ''
 SET @strGroupCriteria = 'GROUP BY' + @strGroup + ' '
ELSE
 SET @strGroupCriteria = ''
/* 실제 조회작업을 시작 */
IF @blnBringAllRecords = 1 -- 페이징 하지 않고 단순한 SELECT 문장만을 실행
BEGIN
 EXEC (' SELECT ' + @strFields + ' FROM ' + @strTables + @strFilterCriteria + @strGroupCriteria + @strSortCriteria)
END -- 전체 레코드를 반환.
ELSE -- 지정된 페이지를 반환
BEGIN
IF @intPageNo = 1 -- 맨 처음 페이지를 찾기 때문에 서브쿼리가 없어서 가장 효율적으로 실행된다.

EXEC (' SELECT TOP ' + @strPageSize + ' ' + @strFields + ' FROM ' + @strTables + @strFilterCriteria + @strGroupCriteria + @strSortCriteria)
ELSE -- 특정 페이지를 선택하기 위해 서브쿼리 구조를 실행한다.
EXEC (
' SELECT ' + @strFields + ' FROM ' + @strTables + ' WHERE ' + @strPK + ' IN ' + '
(SELECT TOP ' + @strPageSize + ' ' + @strPK + ' FROM ' + @strTables +
' WHERE ' + @strPK + ' NOT IN ' + '
(SELECT TOP ' + @strSkippedRows + ' ' + @strPK + ' FROM ' + @strTables +
@strFilterCriteria + @strGroupCriteria + @strSortCriteria + ' ) ' +
@strSimpleFilter +
@strGroupCriteria +
@strSortCriteria + ') ' +
@strGroupCriteria +
@strSortCriteria
)


END -- 특정 페이지를 지정한 경우
/* 전체 레코드 수를 반환하도록 지정된 경우 */
IF @blnGetRecordCount = 1 begin
 IF @strGroupCriteria != ''
  EXEC ( 'SELECT COUNT(*) AS RECORDCOUNT FROM (SELECT COUNT(*) FROM ' + @strTables + @strFilterCriteria + @strGroupCriteria + ') AS tbl (id) ')
 ELSE
  EXEC ( 'SELECT COUNT(*) AS RECORDCOUNT FROM ' + @strTables + @strFilterCriteria + @strGroupCriteria)
end

print 'SELECT ' + @strFields + ' FROM ' + @strTables + @strFilterCriteria + @strGroupCriteria + @strSortCriteria
GO

+ Recent posts