Sql Server 2005 ROW_NUMBER 函数实现分页

过去用SQL Server 2000分页的,大多都用到了临时表。SQL Server 2005 ROW_NUMBER 函数支持分页,性能据说也非常不错。

Paging Records Using SQL Server 2005 Database
Paging in SQL Server 2005

Sql Server 2005自定义分页

最近MSDN Magazine上的一篇文章10 Tips for Writing High-Performance Web Applications提到了有效的数据分页技术对提高ASP .NET程序性能的重要性;并给出了一个实现数据分页的stored procedure的例子,抄录如下:

 

 

CREATE   PROCEDURE  northwind_OrdersPaged

(
    
@PageIndex   int
    
@PageSize   int
)

AS
BEGIN
DECLARE   @PageLowerBound   int
DECLARE   @PageUpperBound   int
DECLARE   @RowsToReturn   int
--  First set the rowcount
SET   @RowsToReturn   =   @PageSize   *  ( @PageIndex   +   1 )
SET   ROWCOUNT   @RowsToReturn
--  Set the page bounds
SET   @PageLowerBound   =   @PageSize   *   @PageIndex
SET   @PageUpperBound   =   @PageLowerBound   +   @PageSize   +   1
--  Create a temp table to store the select results
CREATE   TABLE  #PageIndex 
(
    IndexId 
int   IDENTITY  ( 1 1 NOT   NULL ,
    OrderID 
int
)
--  Insert into the temp table
INSERT   INTO  #PageIndex (OrderID)
SELECT  
    OrderID
FROM  
    Orders
ORDER   BY  
    OrderID 
DESC
--  Return total count
SELECT   COUNT (OrderID)  FROM  Orders
--  Return paged results
SELECT  
    O.
*
FROM  
    Orders O,
    #PageIndex PageIndex
WHERE  
    O.OrderID 
=  PageIndex.OrderID  AND
    PageIndex.IndexID 
>   @PageLowerBound   AND
    PageIndex.IndexID 
<   @PageUpperBound
ORDER   BY  
    PageIndex.IndexID
END  


    在SQL Server 2000里面,由于没有一个有效的进行ranking操作的方法,所以该例子先创建了一个有Identity字段的临时表,利用Identity字段的自增长特性,间接的为Orders表的每一行按orderID逆序赋予了一个行号, 然后基于这个行号实现分页。

在SQL Server 2005里面,由于系统提供了内建的ranking函数,为了给Orders表生成行号,我们不再需要利用Identity字段。

例如,利用SQL Server 2005的ROW_NUMBER()函数,按orderID字段逆序排列,给Orders表生成行号的语句如下:
 

 

SELECT  ROW_NUMBER()  OVER ( ORDER   BY  ordered  DESC AS  rownum, ordered

FROM  Orders

ORDER   BY  rownum  DESC

基于这些新的ranking函数,您可以跟方便的实现数据的分页操作。

关于SQL Server 2005的T-SQL新特性,见文档:

http://msdn.microsoft.com/sql/archive/default.aspx?pull=/library/en-us/dnsql90/html/sql_05tsqlenhance.asp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值