科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道如何实现SQL Server 2005快速Web分页(2)

如何实现SQL Server 2005快速Web分页(2)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

分页,就是按照某种规则显示分组数据集,但是在SQL Server 中,分页并不是十分容易就能够实现。

作者:Tim Chapman 来源:builder.com.cn 2007年9月4日

关键字: 分页 SQL Server SQL Server 2005 数据库

  • 评论
  • 分享微博
  • 分享邮件

现在数据表中已经具有实例数据。接下来我们看看如何调用程序来实现数据的分页显示。列表B包含这个程序的脚本内容。这个程序含有两个参数:

1.页面大小(给定页面要显示的数据记录数目)。

2.目标页面(返回该页的数据记录)。

CREATE PROCEDURE usp_SalesRecords
(
      @PageSize FLOAT,
      @TargetPage SMALLINT
)
AS
BEGIN
      WITH Sales_CTE(PageNumber, SaleID, Product, SaleDate, SalePrice)
      AS
      (
SELECT 
CEILING((ROW_NUMBER() OVER 
ORDER BY SaleDate ASC))/@PageSize) AS PageNumber, SaleID, 
Product, SaleDate, SalePrice 
FROM SalesHistory FROM SalesHistory
      )

      SELECT 
            PageNumber, SaleID, Product, SaleDate, SalePrice
      FROM 
            Sales_CTE
      WHERE 
            PageNumber = @Targetpage
ENDCREATE PROCEDURE usp_SalesRecords
(
      @PageSize FLOAT,
      @TargetPage SMALLINT
)
AS
BEGIN
      WITH Sales_CTE(PageNumber, SaleID, Product, SaleDate, SalePrice)
      AS
      (
SELECT 
CEILING((ROW_NUMBER() OVER 
(ORDER BY SaleDate ASC))/@PageSize) AS PageNumber, SaleID, 
Product, SaleDate, SalePrice 
FROM SalesHistory FROM SalesHistory
      )

      SELECT 
            PageNumber, SaleID, Product, SaleDate, SalePrice
      FROM 
            Sales_CTE
      WHERE 
            PageNumber = @Targetpage
END

列表B

如果你刚刚开始使用SQL Server,可能会不熟悉以“WITH”开头的声明语句。这条语句会调用SQL Server中的一个新属性,我们称之为common table expression(CTE),从本质上来说,我们可以将CTE看作是高版本的临时表。

分页的实质就是CTE中的TSQL语句。在下面的选择语句中,我使用了一个新的排序函数——ROW_NUMBER(这一函数很容易使用,你只需要给ROW_NUMBER函数提供一个域名作为参数,ROW_NUMBER会用它来进行分页)。随后,我使用@PageSize参数来划分每页的行数以及每页的最大行数值。

例如,假设现在有一个包含三条记录的数据集,并设计每页显示两条记录,那么头两条记录将会在第一页显示,因为每页的行数必须小于或者等于第一个变量值。第三条记录将会在第二页显示,因为每页的可显示最大行数值应该小于2但是又大于1。

可以使用下面的脚本调用存储程序:

EXECUTE usp_SalesRecords

@PageSize = 3,

@TargetPage = 2

执行程序后的返回结果如下:

PageNumber
 SaleID
 Product
 SaleDate
 SalePrice
 
2
 12
 PoolTable
 7/11/1908
0:00
 640
 
2
 15
 PoolTable
 8/11/1908
0:00
 641
 
2
 18
 PoolTable
 9/11/1908
0:00
 658

就如你所看到的,程序执行后将会返回一页的数据,包含三条记录,而且返回的是第二页的数据集。

需要注意的一点

一般来说,有两种方法完成数据结果的分页:在数据库层实现和不在数据库层实现。可以在客户端实现分页,但是这样做的时候,所有的数据都会返回到客户端,而且在进行数据分析的时候就决定了页面数目。在早期版本的SQL Server中,可以在数据库层实现分页,但是需要临时表和表变量。如果上面的例子没有使用CTE来进行分页的话,分页程序就不会那么简单。之所以这么简单就是因为使用了ROW_NUMBER函数的强大功能。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章