码迷,mamicode.com
首页 > 其他好文 > 详细

通用分页存储过程

时间:2015-06-04 20:57:12      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:

 

数据库还是用Northwind数据库。就用Orders表为例子吧,假设每页都显示10条记录。

我们先查询第一页的数据。

技术分享
SELECT  *
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY OrderID ) AS RowNumber ,
                    *
          FROM      Orders
        ) T
WHERE   RowNumber BETWEEN 1 AND 10
技术分享

这里用到一个函数ROW_NUMBER() OVER函数,这个函数的语法是ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)

简单的说ROW_NUMBER()从1开始,为每一条分组记录返回一个数字,这里的ROW_NUMBER() OVER (ORDER BY OrderID) 是先把OrderID列升序,再为升序以后的每条记录返回一个序号。 

接下来,查询第二页的数据。

技术分享
SELECT  *
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY OrderID ) AS RowNumber ,
                    *
          FROM      Orders
        ) T
WHERE   RowNumber BETWEEN 11 AND 20
技术分享

由此可以推断出,第N页的数据为

技术分享
SELECT  *
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY OrderID ) AS RowNumber ,
                    *
          FROM      Orders
        ) T
WHERE   RowNumber BETWEEN (N-1)*10+1 AND N*10
技术分享

写成通用的SQL语句如下:

技术分享
BEGIN
    DECLARE @PageSize INT     --每页显示条数
    DECLARE @PageIndex INT    --页码(从1开始)
    SET @PageSize = 10
    SET @PageIndex = 2
    SELECT  *
    FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY OrderID ) AS RowNumber ,
                        *
              FROM      Orders
            ) T
    WHERE   RowNumber BETWEEN ( ( @PageIndex - 1 ) * @PageSize + 1 )
                      AND     ( @PageIndex * @PageSize )
    ORDER BY OrderID ASC
END
技术分享

写成存储过程如下:

技术分享
--存储过程
CREATE PROCEDURE P_GetPagedOrders2
    @PageSize INT ,             --每页显示条数
    @PageIndex INT ,            --页码(从1开始)
    @RecordCount INT OUTPUT ,    --数据总数
    @PageCount INT OUTPUT        --总页数
AS
    BEGIN
        --获取数据总数
        SELECT  @RecordCount = COUNT(1)
        FROM    dbo.Orders
        --计算总页数
        SET @PageCount = @RecordCount / @PageSize
        IF @RecordCount % @PageSize > 0
            BEGIN
                SET @PageCount = @PageCount + 1
            END
        --获取当前页的数据
        SELECT  *
        FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY OrderID ) AS RowNumber ,
                            *
                  FROM      Orders
                ) T
        WHERE   RowNumber BETWEEN ( ( @PageIndex - 1 ) * @PageSize + 1 )
                          AND     ( @PageIndex * @PageSize )
        ORDER BY OrderID ASC
    END
技术分享

测试存储过程

技术分享
DECLARE    @RecordCount int,
           @PageCount int

EXEC    [P_GetPagedOrders2]
        @PageSize = 10,
        @PageIndex = 2,
        @RecordCount = @RecordCount OUTPUT,
        @PageCount = @PageCount OUTPUT

SELECT    @RecordCount as N@RecordCount,
        @PageCount as N@PageCount
技术分享

测试结果如下

技术分享

通用分页存储过程

标签:

原文地址:http://www.cnblogs.com/lykbk/p/addfww4r4535.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!