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
'Databases' 카테고리의 다른 글
SQL Server 2000에서 update시 join의 활용 (1) | 2007.04.25 |
---|---|
IP 주소를 사용하여 SQL Server 데이터베이스에 연결했을 때 속도문제 (1) | 2007.04.25 |
커서 사용법 (0) | 2007.04.25 |
SQL쿼리 분석시-주요 단축키 (1) | 2007.04.25 |
꼭 필요한 tip 몇가지 (1) | 2007.04.25 |