技术开发 频道

SQL Server 2005对结果集分页


TOP的替代

   有一个这样的TOP替代,它使用的是rowcount(行计数)。使用行计数要小心。如果它不关闭的话,将陷入各种各样的困境。
SET rowcount 10 
SELECT * from Customers
ORDER BY CompanyName
WITH, ROW_NUMBER (行数)and OVER

    这对SQL Server 2005来说非常新鲜并且看上去非常有用。下面一个例子显示从一个结果集得到20至19条记录。刚开始有一点惊奇,但是浏览了查询器后发现它是如此简单。
With Cust AS
( SELECT CustomerID, CompanyName,
ROW_NUMBER() OVER (order by CompanyName) as RowNumber
FROM Customers )
select *
from Cust
Where RowNumber Between 20 and 30
    SQL Server 2005的WITH指定了一个临时命名的结果,很像SQL Server以前版本中的临时表。但是,输入部分是ROW_NUMBER和OVER声明,它根据公司的名称在每组中创建行数。这就像通过命令条文向临时表添加一个身份种子。
我希望你赞成我的看法。如果不,运行代码并查看结果集。对大表来说速度真的非常快; 表的速度超过250,000条记录,对此我留下了深刻的印象。

一起整合到储存过程中

   现在我们把它一起整合到储存过程,这个储存过程我们可以通过应用程序来使用。暂时不展示.NET Datagrid或者相似的控件,因为是本文探讨范围之外。下面看到的储存过程使用了灵活的页面大小和页面数目,所以可以随意地选择任何页面。这样,如果想跳过前十页去寻找某一条记录就非常方便了。下面的例子是从第一页开始分页的,而不是从第0页,但也可以随意更改。

CREATE PROC GetCustomersByPage 
@PageSize int, @PageNumber int
AS
Declare @RowStart int
Declare @RowEnd int
if @PageNumber > 0
Begin
SET @PageNumber = @PageNumber -1
SET @RowStart = @PageSize * @PageNumber + 1;
SET @RowEnd = @RowStart + @PageSize - 1 ;
With Cust AS
( SELECT CustomerID, CompanyName,
ROW_NUMBER() OVER (order by CompanyName) as RowNumber
FROM Customers )
select *
from Cust
Where RowNumber >= @RowStart and RowNumber <= @RowEnd end
END

   运行这个程序,仅需指定页面大小和页数目(GetCustomersByPage, @PageSize and @PageNumber),代码如下:

exec GetCustomersByPage 10, 1
0
相关文章