Note/그밖에

asp 에서 MSSQL 페이징처리

Delia :D 2011. 8. 22. 10:38
페이징처리는 참.. 귀찮다 -_-
하지만 페이징 처리는 꼭 해봐야 하는 작업이고 꼭 할줄 알아야 하는 작업이다.
대부분의 DB에서 ROW NUMBER 를 알수있는 내장함수를 지원하지만
MSSQL 2000 이하버전에서는 ROWNUMBER 를 알수 없으므로 다른 방법으로 접근해야한다.
물론 여러가지 방법이 있겠지만
본인이 사용해본 방법을 소개해본다.



페이징 처리에는 몇가지 정보가 필요하다.
리스트의 총 레코드갯수, 한페이지에 표시할 레코드 갯수(화면에 보여질 갯수)
총 페이지 갯수, 현재 페이지 번호(보여주어야 할 페이지).

// 총 개수 - 리스트 쿼리
SQL = "SELECT count(*) as recordCount FROM HPA010T  "
SQL = SQL & " WHERE SEQ IS NOT NULL "

Set rs = dbCon.Execute(SQL)
'// 총 레코드 갯수
li_totalCnt = FormatNumber(rs("recordCount"), 0)

'// 한 페이지 표시 레코드 수
li_recordCnt = 10

'// 총 페이지 갯수
li_pageCnt = int((li_totalCnt-1)/li_recordCnt) + 1

'// 페이지 번호 - movePage를 get으로 받아온다
li_movePage = Request.QueryString("movePage")

'//2005 이후 버전에서만 RowNum 를 지원함
SQL = ""
SQL = SQL & " SELECT   SEQ                      "
SQL = SQL & "         ,USE_YN                   "
SQL = SQL & "         ,TITLE                    "
SQL = SQL & "         ,START_DT                 "
SQL = SQL & "         ,END_DT                   "
SQL = SQL & "         ,KIND_TP                  "
SQL = SQL & "         ,POPUP_TP                 "
SQL = SQL & "         ,INSERT_DT                "
SQL = SQL & "   FROM   (SELECT   ROW_NUMBER() OVER (ORDER BY INSERT_DT DESC) AS RowNum   "
SQL = SQL & "                   ,SEQ            " 
SQL = SQL & "                   ,USE_YN         " 
SQL = SQL & "                   ,TITLE          " 
SQL = SQL & "                   ,START_DT       " 
SQL = SQL & "                   ,END_DT         " 
SQL = SQL & "                   ,KIND_TP        " 
SQL = SQL & "                   ,POPUP_TP       " 
SQL = SQL & "                   ,INSERT_DT      " 
SQL = SQL & "             FROM   HPA010T        " 
SQL = SQL & "           ) AS K            "
SQL = SQL & "  WHERE    RowNum BETWEEN "& ((li_movePage - 1) * li_recordCnt) + 1 & " 
SQL = SQL & "                       AND " & ((li_movePage - 1) * li_recordCnt) + li_recordCnt

<설명>
1. from절 : 가져오려는 orderby 로 row번호를 붙여 select한다.
2. 1에서 가져온 테이블에서 RowNum 에 범위를 주어 원하는 범위의 데이터만 가져온다.
예) 1페이지당 10개씩 보여준다고 할때 3페이지의 리스트를 가져올 경우 시작번호는 21, 끝번호는 30가 된다.



'//2000이하버전에서는 RowNum를 지원하지 않기때문에 유일한 키를 갖고 페이징처리함. 

'//**()안과 바깥에 조건이 같아야 함**
SQL = ""
SQL = SQL & " SELECT   TOP " & li_recordCnt & " 
SQL = SQL & "          SEQ                    " 
SQL = SQL & "         ,USE_YN                 " 
SQL = SQL & "         ,TITLE                  " 
SQL = SQL & "         ,START_DT               " 
SQL = SQL & "         ,END_DT                 " 
SQL = SQL & "         ,KIND_TP                " 
SQL = SQL & "         ,POPUP_TP               " 
SQL = SQL & "         ,INSERT_DT              " 
SQL = SQL & "   FROM   HPA010T                " 
SQL = SQL & "  WHERE   SEQ NOT IN             " 
SQL = SQL & "          (SELECT TOP " & ((li_movePage - 1) * li_recordCnt) & " SEQ "  
SQL = SQL & "             FROM HPA010T               "
SQL = SQL & "            WHERE SEQ IS NOT NULL       "
SQL = SQL & "            ORDER BY INSERT_DT DESC )   "
SQL = SQL & " ORDER BY INSERT_DT DESC                "

<설명> 1페이지당 10개씩 보여준다고 할때 3페이지의 리스트를 가져올 경우
1. 조건 : 데이터의 유일한 키가 되는 값이 있어야 한다. WHERE 절 안과 밖 select 의 ORDER BY가 같아야 한다.
2. 원하는 orderby로 TOP 30 개를 select 한다.
3. 같은 orderby로 TOP 20 개를  select 한다.
4. 2에서 3을 뺀다. (여기서는 NOT IN을 사용) - 이 작업이 정확히 이뤄질려면 유일한 키로 NOT IN 처리 해야한다.




'Note > 그밖에' 카테고리의 다른 글

php 대소문자 처리  (0) 2011.09.27
php explode() 함수  (0) 2011.09.26
ASP :: 쿼리 결과를 배열에 자동으로 담기  (0) 2011.08.22
CSS 속성  (0) 2011.07.21
MDF 파일로 복원하기  (1) 2011.07.11