专栏首页张善友的专栏Sql Server 2005 ROW_NUMBER 函数实现分页

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 条评论
登录 后参与评论

相关文章

  • SQL Server 2012将与Hadoop无缝集成

    SQL Server 2012致力提供大规模且低成本的分析数据和数据仓库解决方案,并保证实现规模化和灵活性。在大数据时代Microsoft也做出了一些完善。 结...

    张善友
  • Sql Server 2008 为开发带来的新特性

    许多数据库开发人员负责创建的查询需要用来返回其应用程序所需的数据。您可能熟悉 LINQ(语言集成查询)工具,它允许数据库开发人员使用基于 Microsoft® ...

    张善友
  • Ibatis in action 电子书

    电子书 ? 是ibatis 项目组写的ibatis开发的权威书籍.现在只有电子版,目前使用Java作为描述的平台,这个书对于.NET和Ruby一样适用.    ...

    张善友
  • 发售即“暴死”的《无人深空》再推VR模式,曾经的“无人深坑”如何一步步实现逆袭?

    谈到逆袭的游戏作品,《无人深空》不可不提。从最初的高开低走,到制作团队埋头进行优化,再到后续推出的多人模式、VR模式,这款曾被称为“无人深坑”的独立游戏已经逐渐...

    VRPinea
  • SQL Server 2012使用日常

    _一级菜鸟
  • SQLServer 2005Windows验证如何改为混合模式验证

    默认情况下,SQL Server 2005 Express是采用集成的Windows安全验证且禁用了sa登录名,而很多用户使用数据库的时候需要用到sql身份验...

    授客
  • 由重构react组件引发的函数式编程的思考

    最近在重构react组件时,学习了一些高阶组件的编写思路,其实是由高阶函数沿伸而来。 一般情况我们编写一个react组件大致样子如下:

    2014v
  • 带你深入了解NPM——NPM初学者指南

    前段时间,我们邀请了我们“城内”(葡萄城)资深开发工程师刘涛为大家分享了一次干货满满的关于Electron线上公开课,在课程过程中有不少同学对于NPM的概念和用...

    葡萄城控件
  • 速战速决---3小时快速搭建Exchan

            SQL Server 2014 Enterprise ISO光盘镜像

    py3study
  • 【董天一】什么是IPFS?(三)

    上面的应用场景是 IPFS的创始人 Juan Benet 在IPFS论文里面直接提到的. 有兴趣的同学可以去IPFS白皮书里面看一下。

    圆方圆学院

扫码关注云+社区

领取腾讯云代金券