2011-03-19 30 views
1

我需要使用數據庫端分頁,就像表中有10000條記錄那麼我必須首先填充100條記錄,然後再記錄100條記錄。我正在使用SQL Server 2005請爲此提供存儲過程代碼。數據庫端分頁

+0

需要(免費)登記但在這種兩部分的系列http://www.sqlservercentral.com/articles/paging/69892/ – 2011-03-20 22:56:38

回答

2

你應該看看,因爲SQL Server中的ROW_NUMBER()功能2005

它已被證明是最有效的方式(對我來說)做服務器端分頁。

例子:

SELECT * 
FROM (
    SELECT col1, col2, col3, 
      ROW_NUMBER() OVER(ORDER BY col1 ASC) AS rownbr 
    FROM table 
    WHERE col2 = 'something' 
) AS Query 
WHERE rownbr BETWEEN 1 AND 10 
ORDER BY rownbr 

您可以設置要在OVER()語句,以便通過列,要在外部檢索WHERE語句的第一個和最後一排。

1

如果你實際上是在嘗試,你有頁碼頁面,那麼你可以做類似如下:

Create Procedure GetPagedStuff(@PageNumber int, @PageSize int) 
As 

;With RankedRows As 
    (
    Select ... 
     , Row_Number() Over (Order By SomeColumn) As Num 
     , Count(NonNullColumn) Over() As TotalRows 
    From MyTable 
    ) 
Select ... 
From RankedRows 
Where Num > (@PageNumber - 1) * @PageSize 
    And Num <= @PageNumber * @PageSize 

Return 

-- example call 
Exec GetPagedStuff @PageNumber = 1, @PageSize = 100 
1

正如Jason和托馬斯,ROW_NUMBER()函數是你最好的選擇建議。但是,如果滿足WHERE子句的記錄數量非常高,則可能需要檢索主鍵,然後再次使用同一個表加入子集以獲取其他列。

例如:

SELECT e.col1, e.col2, e.col3 
FROM Table1 e 
JOIN 
(SELECT ID, rownum= ROW_NUMBER() 
FROM Table1 
WHERE col1 = @filterParam 
ORDER BY LastName) 
f ON f.ID = e.ID 
WHERE f.rownum BETWEEN 100 AND 150 
2
DECLARE @PageSize INT, 
    @PageNumber INT, 
    @FirstRow INT, 
    @LastRow INT 

SELECT @PageSize = 20, 
      @PageNumber = 1  


SELECT @FirstRow = (@PageNumber - 1) * @PageSize + 1, 
    @LastRow = (@PageNumber - 1) * @PageSize + @PageSize ; 

WITH Members AS 
( 
    SELECT Col1,Col2,Col3, 
      ROW_NUMBER() OVER (ORDER BY Col1 DESC) AS RowNumber 
       FROM Table 
) 
SELECT Col1,Col2,..,..,.., 
FROM Members 
WHERE RowNumber BETWEEN @FirstRow AND @LastRow 
ORDER BY Col1 ASC; 
+2

參閱HTTP覆蓋井:// www.sqlteam.com/article/server-side-paging-using-sql-server-2005 – Sutirth 2012-03-12 22:05:24