2011-03-03 85 views
0

在SQL Server 2005和2008中分頁查詢結果的最佳方式是什麼?來自複雜SQL Server查詢的分頁結果

我想出了以下方法:

  1. 執行查詢,其結果保存到一個表變量或臨時表。

  2. 使用下面的代碼:

    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 
    

但是,我沒有任何分頁巨大的數據集,我自己的經驗。其他SOE還有什麼建議?

+0

對不起..早熟輸入密鑰... – GunnerL3510 2011-03-03 21:14:46

+0

也許這[鏈接](http://www.sqlteam.com/article/server-side-paging-using-sql-server-2005)也可能是有用的SQL Server 2005用戶 – 2013-03-03 18:53:17

回答

2

STORED PROCEDURE正文可寫爲:

;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)的STORED PROCEDURE,並且您當然需要臨時表。

P.S.另外,我認爲你的變量聲明只能在2008年工作,如果我沒有記錯,2005不支持單行實例化和初始化。

+0

感謝您對SQL Server 2005中變量的內聯初始化進行更正。 – pyon 2011-03-03 22:00:13

1

如果您的數據集很大,@table將無法正常運行。您ROW_NUMBER還可以優化有點不走過去@ToRow

JOIN (SELECT TOP(@ToRow) TV2.PrimaryKey, ROW_NUMBER() OVER(...) AS RowNo 
     FROM @TableVariable TV2 
     ORDER BY ... -- same clause as ROW_NUMBER() 

我已往下跌存儲過程的路徑,填充一個#table(使用如上所示的頂部),在同一時間SELECT INTO使用IDENTITY(INT,1,1)或預創建表包含標識(羣集),則代替DELETE然後選擇(2個OPS),剛剛從#temptable選擇基於

WHERE id-column between x and y