2011-03-03 5 views
0

SQL Server 2005 및 2008의 복잡한 쿼리 결과를 페이지에 표시하는 가장 좋은 방법은 무엇입니까?복잡한 SQL Server 쿼리의 페이징 결과

나는 다음과 같은 접근 방식 내놓았다 :

  1. 가 쿼리를 수행 테이블 변수 또는 임시 테이블에 그 결과를 저장합니다.

    DECLARE @Rows INT = (SELECT COUNT(*) FROM @TableVariable) 
    
    DELETE TV 
    FROM @TableVariable TV 
    JOIN (SELECT TV2.PrimaryKey, ROW_NUMBER() OVER(...) AS RowNo 
         FROM @TableVariable TV2) N ON TV.PrimaryKey = TV2.PrimaryKey 
    WHERE N.RowNo < @FromRow OR N.RowNo > @ToRow 
    
    SELECT PrimaryKey, SomeComputedField, ... 
    FROM @TableVariable 
    
    RETURN @Rows 
    

는 그러나, 나는 거대한 데이터 세트 나 자신을 페이징 경험이없는 :

  • 다음 코드를 사용합니다. 다른 SOers는 무엇을 제안해야합니까?

  • +0

    미안 ... 조기 입력 키 ... – GunnerL3510

    +0

    어쩌면이 [link] (http://www.sqlteam.com/article/server-side-paging-using-sql-server-2005)도 유용 할 수 있습니다. SQL Server 2005 사용자 –

    답변

    2

    에 기초 #temptable에서 선택 저장 절차 과정은 다음과 같이 작성 될 수 있습니다 :

    ;WITH rownums AS (
        SELECT tempTable.[link], 
          ROW_NUMBER() OVER (ORDER BY tempTable.[link]) AS rownum 
        FROM <temptable here> AS tempTable 
    ) 
    SELECT tempTable.link 
    FROM <temptable here> AS tempTable 
         INNER JOIN rownums AS rn 
         ON rn.[link] = drn.[link] 
    WHERE rn.[rownum] BETWEEN @low AND @high 
    

    그런 다음 저장 프로 시저에 범위 (@low 및 @high)를 제공해야하며 임시 테이블이 필요합니다.

    P. 또한 올바르게 선언 한 변수 선언은 2008에서 작동합니다. 단 한 줄의 인스턴스화 및 초기화는 지원하지 않습니다.

    +0

    SQL Server 2005에서 변수의 인라인 초기화와 관련하여 수정 해 주셔서 감사합니다. – pyon

    1

    데이터 세트가 큰 경우 @ 테이블은 제대로 작동하지 않습니다. 귀하의 ROW_NUMBER는 @ToRow 과거 이동하지 조금을 최적화 할 수 있습니다

    JOIN (SELECT TOP(@ToRow) TV2.PrimaryKey, ROW_NUMBER() OVER(...) AS RowNo 
         FROM @TableVariable TV2 
         ORDER BY ... -- same clause as ROW_NUMBER() 
    
    나도 같은 시간에, (위의 그림과 같이 TOP을 사용하여) #table 채우기, 저장된 프로 시저의 경로를 아래로 갈 것

    아이덴티티 (클러스터)으로 IDENTITY (INT, 1,1) 또는 사전 작성 INTO 테이블을 이용하여 선택하고, (2 OPS)을 선택한 후, 삭제 대신에, 단지

    WHERE id-column between x and y 
    
    관련 문제