Sql server 2005 救命啊!如何从SQL Server分页过程中获取总行数?

Sql server 2005 救命啊!如何从SQL Server分页过程中获取总行数?,sql-server-2005,data-paging,Sql Server 2005,Data Paging,好的,我的SQL Server数据库中有一个存储注释的表。我的愿望是能够使用数据列表中的[返回]、[下一步]、页码和[最后一步]按钮翻阅记录。我认为最有效的方法是使用只返回特定范围内一定数量行的存储过程。这是我想到的 @PageIndex INT, @PageSize INT, @postid int AS SET NOCOUNT ON begin WITH tmp AS ( SELECT comments.*, ROW_NUMBER() OVER (ORDER BY date

好的,我的SQL Server数据库中有一个存储注释的表。我的愿望是能够使用数据列表中的[返回]、[下一步]、页码和[最后一步]按钮翻阅记录。我认为最有效的方法是使用只返回特定范围内一定数量行的存储过程。这是我想到的

@PageIndex INT, 
@PageSize INT,
@postid int


AS
 SET NOCOUNT ON  
 begin

WITH tmp AS ( 
SELECT comments.*, ROW_NUMBER() OVER (ORDER BY dateposted ASC)  AS  Row
    FROM    comments
    WHERE     (comments.postid = @postid))

SELECT tmp.*
FROM tmp
WHERE Row between 

(@PageIndex - 1) * @PageSize + 1 and @PageIndex*@PageSize

end

RETURN 
现在一切正常,我已经能够在我的数据列表页面中实现[Next]和[Back]按钮。现在我需要所有评论的总数(不在当前页面中),这样我就可以实现我的页码和我的寻呼机上的[Last]按钮。换句话说,我想返回我的第一条select语句中的总行数,即

  WITH tmp AS ( 
    SELECT comments.*, ROW_NUMBER() OVER (ORDER BY dateposted ASC)  AS  Row
        FROM    comments
        WHERE     (comments.postid = @postid))
set @TotalRows = @@rowcount
@@rowcount不工作并引发错误。我也不能让count.*工作


是否有其他方法可以获得行的总数,或者我的方法注定失败

要获取页面的评论总数,需要单独查询:

SELECT TotalRows = COUNT(*)
FROM comments
WHERE comments.postid = @postid

在同一查询中返回此数据的唯一方法是将数据作为子查询存储在主存储过程中,并返回存储过程中每一行的总数。

我已经解决了这个问题,最后我找到了一些解决方案,这些解决方案都不是很好,但是可以做到:

  • 查询两次
  • 将计数作为列之一返回
  • 将结果填充到临时表中,同时将计数作为列返回
  • 在第一个解决方案中,您可以执行以下操作:

        ...
        , @Count int OUTPUT
    AS 
    Select @Count = (
                    Select Count(*)
                    From comments
                    Where comments.postid = @postid
                        And Col1 = ... And Col2 = ...
                    )
    
    With NumberedResults As
        (
        Select ...
            , ROW_NUMBER() OVER( ORDER BY dateposted ASC ) As Num
        From comments
        Where Col1 = ... And Col2 = ...
        )
    Select ...
    From NumberedResults
    Where Num Between ( @PageIndex - 1 ) * @PageSize + 1 and @PageIndex * @PageSize
    
    明显的缺点是,如果查询很昂贵,则需要执行两次

    在第二种解决方案中,只需返回计数作为结果的一部分。然后,您将从业务层代码中的第一条记录中提取计数。优点是只需执行一次昂贵的查询。缺点是,结果中的每一行都会额外返回四个字节

    With NumberedResults As
        (
        Select ...
            , ROW_NUMBER() OVER( ORDER BY dateposted ASC ) As Num
        From comments
        Where Col1 = ... And Col2 = ...
        )
    Select ...
        , ( Select Count(*) From NumberedResults ) As TotalCount
    From NumberedResults
    Where Num Between ( @PageIndex - 1 ) * @PageSize + 1 and @PageIndex * @PageSize
    
    第三种解决方案是第二种解决方案的一种变体,将结果填充到临时表中,并从第一条记录设置out参数

        ...
        , @TotalCount int OUTPUT
    AS
    
    Declare @PagedResults Table (
                                Col1 ...
                                , ...
                                , TotalCount int
                                )
    With NumberedResults As
        (
        Select ...
            , ROW_NUMBER() OVER( ORDER BY dateposted ASC ) As Num
        From comments
        )
    Insert @PagedResults( Col1...., TotalCount )
    Select ...
        , ( Select Count(*) From NumberedResults ) As TotalCount
    From NumberedResults
    Where Num Between ( @PageIndex - 1 ) * @PageSize + 1 and @PageIndex * @PageSize
    
    Set @TotalCount = ( Select TOP 1 TotalCount From @PagedResults )
    
    Select ...
    From @PagedResults
    

    在几个小时的谷歌搜索解决方案后,我开始认为数据分页只为精英保留:-(+1谢谢。我现在知道除了你所说的选项之外没有其他选择了。我可能会选择第二个。这有点混乱,但比重新查询要好得多。有一段时间,我认为有一个只有精英才知道的“神奇”行数命令!我也想到了这一点,但认为有更好的方法,只有少数幸运的人知道w、 1.我想没有