【问题标题】:SQL Server 2005 filtering and paging with ROW_NUMBER()SQL Server 2005 使用 ROW_NUMBER() 进行过滤和分页
【发布时间】:2009-12-07 06:10:18
【问题描述】:

我有一个包含数千条记录的表,我想实现分页逻辑。经过一番研究,我发现了 SQL Server 2005 中引入的 ROW_NUMBER() 函数。我的问题是,它似乎不能满足我的确切需求,我想知道如何调整我的存储过程以使其按预期工作:

ALTER PROCEDURE dbo.irweb_Posts_CollectCategoryIdDatesRange
    (
    @CategoryId int,
    @StartDate datetime,
    @EndDate datetime,
    @IsDeleted bit,
    @PageIndex int,
    @PageSize int,
    @Offset int
    )
AS
    DECLARE @TotalRecords   int

    SELECT @TotalRecords = (
        SELECT COUNT(irweb_Posts.PostId) 
        FROM irweb_Posts 
        WHERE (IsDeleted = @IsDeleted)
        AND (CategoryId = @CategoryId)
    AND (DateCreated >= @StartDate) 
    AND (DateCreated <= @EndDate)           
    )

    SELECT * 
    FROM (
        SELECT  ROW_NUMBER() OVER (ORDER BY DateCreated DESC) AS RowId, irweb_Posts.*
        FROM      irweb_Posts
        ) AS p
    WHERE   ((IsDeleted = @IsDeleted)
        AND (CategoryId = @CategoryId)
        AND (DateCreated >= @StartDate) 
        AND (DateCreated <= @EndDate)       
        AND ((RowId > @Offset) AND (RowId <= (@Offset + @PageSize))))   

    RETURN @TotalRecords

如果我执行这个存储过程,我会得到以下结果

Running [dbo].[irweb_Posts_CollectCategoryIdDatesRange] ( 
@CategoryId = 7, 
@StartDate = 5/1/2009 12:00:00 AM, 
@EndDate = 5/31/2009 11:59:59 PM, 
@IsDeleted = False, 
@PageIndex = 0, 
@PageSize = 20, 
@Offset = 0 ).

RowId                 PostId      CategoryId  ParentId    
--------------------- ----------- ----------- ----------- 
No rows affected.
(0 row(s) returned)
@RETURN_VALUE = 609
Finished running [dbo].[irweb_Posts_CollectCategoryIdDatesRange].


Running [dbo].[irweb_Posts_CollectCategoryIdDatesRange] ( 
@CategoryId = 7, 
@StartDate = 5/1/2009 12:00:00 AM, 
@EndDate = 5/31/2009 11:59:59 PM, 
@IsDeleted = False, 
@PageIndex = 0, 
@PageSize = 210, 
@Offset = 0 ).

RowId                 PostId      CategoryId  ParentId    
--------------------- ----------- ----------- ----------- 
205                   1173        7           0           
206                   1169        7           0           
207                   1168        7           0           
208                   1167        7           0           
209                   1165        7           0           
210                   1164        7           0           
No rows affected.
(6 row(s) returned)
@RETURN_VALUE = 609
Finished running [dbo].[irweb_Posts_CollectCategoryIdDatesRange].

行号字段似乎不像预期的那样从 1 开始。我怀疑它从 1 开始对于整个表而不是过滤的结果集。如果我不需要过滤记录的分页,那将不是问题。我怎样才能做到这一点?

【问题讨论】:

    标签: sql-server-2005 paging


    【解决方案1】:

    将 where 子句移到里面,将行号检查留在外面

    SELECT *     
    FROM (        
            SELECT  ROW_NUMBER() OVER (ORDER BY DateCreated DESC) AS RowId, irweb_Posts.*        
            FROM      irweb_Posts        
            WHERE   (   (IsDeleted = @IsDeleted)        
                AND (CategoryId = @CategoryId)        
                AND (DateCreated >= @StartDate)         
                AND (DateCreated <= @EndDate))
        ) as p    
    WHERE ((RowId > @Offset) AND (RowId <= (@Offset + @PageSize)))
    

    【讨论】:

    • 哇哦!太感谢了。我之前曾尝试过,但忽略了“AS”子句——没有用。没想到...再次感谢!
    • 我知道这个话题已经很好地结束了,但是对于一个简单的分页选择来说,这是非常出色的。那里有很多复杂的解决方案。这简直太棒了。
    猜你喜欢
    • 2011-07-18
    • 1970-01-01
    • 2010-09-18
    • 2011-06-16
    • 1970-01-01
    • 2013-08-06
    • 2010-09-05
    • 1970-01-01
    相关资源
    最近更新 更多