分页存储过程怎么准确获取总记录数

telankes2000 2010-07-02 08:23:26

alter PROCEDURE [dbo].[Pro_Sys_Page2005]
@TableName nvarchar(4000), --表名
@Columns nvarchar(4000) = '*', --字段名(全部字段为*)
@OrderColumns nvarchar(1000), --排序字段(必须!支持多字段)
@sqlWhere nvarchar(2000) = Null,--条件语句(不用加where)
@pageSize int, --每页多少条记录
@pageIndex int = 1 --指定当前为第几页
AS
BEGIN
Declare @sql nvarchar(4000),@totalRecord int, @TotalPage int, @StartRecord int,@EndRecord int;
if (isnull(@SqlWhere,'')<>'')
begin
set @TableName = @TableName + ' where ' + @sqlWhere--+ ' order by '+@OrderColumns
end
set @sql='select @totalRecord=count(1)from '+@TableName+''
--print @sql
EXECUTE sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--计算总记录数
--select @totalRecord=@@rowcount
--print @totalRecord
select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize) --计算总页数
if @PageIndex<=0
Set @pageIndex = 1
if @pageIndex>@TotalPage
Set @pageIndex = @TotalPage
set @StartRecord = (@pageIndex-1)*@PageSize + 1
set @EndRecord = @StartRecord + @pageSize - 1
set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderColumns + ') as rowId,' + @Columns + ' from ' + @TableName +') as t where rowId between ' + cast(@StartRecord as nvarchar) + ' and ' + cast( @EndRecord as nvarchar)
print @sql
Exec(@Sql)
select @totalRecord as totalRecord ,@TotalPage as pageCount--总记录数,总页数
END
--如果 sql语句包含group by 那么记录总数就会取group by的最后一行的值
--应该怎么改才可以获取准确的记录总数呢
--@@rowcount 也试过不行
--代group by的sql 怎么获取总记录数呢

...全文
189 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
telankes2000 2010-07-02
  • 打赏
  • 举报
回复
頂一下
yidongliange4 2010-07-02
  • 打赏
  • 举报
回复
楼主要么用我这个

if exists(select *From sysobjects where name ='pagination')
drop proc pagination
go
CREATE PROCEDURE pagination
@tblName varchar(255), -- 表名
@strGetFields varchar(1000) = '*', -- 需要返回的列
@fldName varchar(255)='', -- 排序的字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@doCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1500) = '' -- 查询条件 (注意: 不要加 where)
AS

declare @strSQL varchar(5000) -- 主语句
declare @strTmp varchar(110) -- 临时变量
declare @strOrder varchar(400) -- 排序类型
if @doCount != 0 --需要返回记录条数
begin
if @strWhere !=''
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where '+@strWhere
else
set @strSQL = 'select count(*) as Total from [' + @tblName + ']'
end
--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况

else
begin
if @OrderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = ' order by [' + @fldName +'] desc'
--如果@OrderType不是0,就执行降序,这句很重要!
end

else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by [' + @fldName +'] asc'
end
if @PageIndex = 1
begin
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from [' + @tblName + '] where ' + @strWhere + ' ' + @strOrder
else
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['+ @tblName + '] '+ @strOrder
--如果是第一页就执行以上代码,这样会加快执行速度
end

else
begin
--以下代码赋予了@strSQL以真正执行的SQL代码
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['+ @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'+ @strOrder
print @strsql
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
+ @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder

end
end
print @strsql
exec (@strSQL)
GO



统计最好的方式是 select count(1) from table
telankes2000 2010-07-02
  • 打赏
  • 举报
回复
本來我用@@rowcount 是可以的
但是如果sql不包含group by 又不準確了
我的疑問就在這裡
telankes2000 2010-07-02
  • 打赏
  • 举报
回复
我要的是group by之後的總記錄數 不是組數 我要那個沒意義
我就是想要執行這個sql後 總共有多少條數據
zhulong1111 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 telankes2000 的回复:]
感謝大家的回答
不過好像都沒有仔細看問題
我的問題是如果帶group by 統計出記錄總數就不準確
[/Quote]group by 是分组 ,分组后count 是组数,并非总数?
telankes2000 2010-07-02
  • 打赏
  • 举报
回复
感謝大家的回答
不過好像都沒有仔細看問題
我的問題是如果帶group by 統計出記錄總數就不準確
tashiwoweiyi 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gongsun 的回复:]
count(*) 太恶心了...
[/Quote]++
gongsun 2010-07-02
  • 打赏
  • 举报
回复
count(*) 太恶心了...
gongsun 2010-07-02
  • 打赏
  • 举报
回复
总数=(总页数-1)*每页条数+最后一页的条数
myhope88 2010-07-02
  • 打赏
  • 举报
回复
你只能重新查找吧,用count(*),后面的条件要跟上面的一样
zhulong1111 2010-07-02
  • 打赏
  • 举报
回复
select count(*) from table

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧