2011-02-23 5 views
1

SQL Server에서 페이징을 수행하는 중 this nice example이 발견되었지만 일부 동적 순서 지정이 필요합니다.동적 순서 지정을 사용하는 SQL Server 페이징?

ORDER BY 
    CASE WHEN @orderBy = 1 THEN DateDiff(ss, getdate(), received_date) --oldest 
     WHEN @orderBy = 2 THEN DateDiff(ss, received_date, getdate()) --newest 
     WHEN @orderBy = 3 THEN message_id --messageid 
     WHEN @orderBy = 4 THEN LEFT(person_reference, LEN(person_reference)-1) --personid 
    END 

은 동적 순서의 양식, 페이징을 할 수 있나요 : 즉,이 같은 다음 순서를 수행하는 데 사용됩니다 정수에서 사용자 패스, 무엇입니까?

+0

무엇이 작동하지 않습니까? –

+0

예, 가능합니다. –

답변

4

대신 ORDER BY 코드를 ROW_NUMBER 창 함수로 이동하십시오. 이 예

SELECT * -- your columns 
FROM 
(
    SELECT *, ROWNUM = ROW_NUMBER() OVER (
    ORDER BY 
     CASE WHEN @orderBy = 1 THEN DateDiff(ss, getdate(), received_date) --oldest 
      WHEN @orderBy = 2 THEN DateDiff(ss, received_date, getdate()) --newest 
      WHEN @orderBy = 3 THEN message_id --messageid 
      WHEN @orderBy = 4 THEN LEFT(person_reference, LEN(person_reference)-1) --personid 
     END 
    ) 
    FROM TBL 

) R 
where ROWNUM between ((@pageNumber-1)*@PageSize +1) and (@pageNumber*@PageSize) 

BY 복잡한 순서와 윈도우 기능을 가진 가장 큰 문제처럼

은 완전히 하나의 페이지를 반환하기 전에 모든 행에 대해 ROWNUM을 구체화 끝날 것입니다.

+0

Richard. 감사합니다. 그래, 너의 경고는 내가 두려워했던 것이었다. 임시 테이블에 전체 테이블을 선택하고, 주문한 다음 '사이에'비트를 선택하는 것과 같이 '일종의'입니다. 그래서 DB에 가혹한 것 같습니다. 나는 다음 SQL Server에서 더 나은 페이징 기능을 제공한다고 믿는다. – Craig

관련 문제