2011-03-19 61 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