Sql server 2005 救命啊!如何从SQL Server分页过程中获取总行数?
好的,我的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
@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.我想没有