存储过程分页问题

xjc55 2007-11-02 10:25:32
利用存储过程分页时,统计行数一般用@totalCount=count(*)
但是如果利用(group by)分组后就不能统计了,得到的只是最后一个行的值
各位朋友,有没有什么办法解决?

如果您经常用存储过程分页,就可略去下面的代码

具体的存储过程如下:
CREATE PROCEDURE Pagination
@TotalCount INT OUTPUT,
@TotalPage INT OUTPUT,
@Table NVARCHAR(25), --将要查询的表名
@Column NVARCHAR(150),--将要查询的字段,可多列
@OrderColumn NVARCHAR(50), --排序字段
@CountColumn NVARCHAR(500), --取这个字段的最大值
@PageSize INT,--分页大小
@CurrentPage INT, --要查询的页
@OrderType NVARCHAR(4),--如何排序
@Condition NVARCHAR(2000) --查询条件
AS
DECLARE @PageCount INT,--总页数
@strSql NVARCHAR(4000), --主查询语句
@strTemp NVARCHAR(2000), --临时变量
@strCount NVARCHAR(1000),--统计语句
@strOrderType NVARCHAR(1000) --排序语句
BEGIN
IF @PageSize>80
BEGIN
SET @PageSize=80
END
SET @PageCount=@PageSize*(@CurrentPage-1)
IF @OrderType='DESC'
BEGIN
SET @strTemp='<(SELECT MIN'
SET @strOrderType=' ORDER BY ' + @OrderColumn +' DESC'
END
ELSE
BEGIN
SET @strTemp='>(SELECT MAX'
SET @strOrderType=' ORDER BY ' + @OrderColumn +' ASC'
END
IF @Condition!='NO'
BEGIN
IF @CurrentPage=1
BEGIN
SET @strCount='SELECT @TotalCount=COUNT(*) FROM '+ @Table + ' WHERE '+@Condition
SET @strSql='SELECT TOP '+ str(@PageSize) +' '+ @Column +' FROM '+ @Table + '
WHERE ' + @Condition + ' '+@strOrderType
END
ELSE
BEGIN
SET @strCount='SELECT @TotalCount=COUNT(*) FROM '+ @Table + ' WHERE '+@Condition
SET @strSql='SELECT TOP '+ str(@PageSize) +' '+ @Column +' FROM '+ @Table + '
WHERE ' + @CountColumn+' '+ @strTemp+ '('+ @CountColumn +')
FROM (SELECT TOP ' + str(@PageCount)+' '+ @CountColumn+'
FROM ' + @Table + ' WHERE '+@Condition+' '+@strOrderType+') AS T) AND '+ @Condition + ' '+@strOrderType
END
END
ELSE
BEGIN
IF @CurrentPage=1
BEGIN
SET @strCount='SELECT @TotalCount=COUNT(*) FROM '+ @Table
SET @strSql='SELECT TOP '+ str(@PageSize) +' '+ @Column +' FROM '+ @Table +' '+@strOrderType
END
ELSE
BEGIN
SET @strCount='SELECT @TotalCount=COUNT(*) FROM '+ @Table
SET @strSql='SELECT TOP '+ str(@PageSize) +' '+ @Column +' FROM '+ @Table +' WHERE ' + @CountColumn+ ' '+ @strTemp+ '('+ @CountColumn +')
FROM (SELECT TOP ' + str(@PageCount)+' '+ @CountColumn+'
FROM ' + @Table + ' '+@strOrderType+') AS T) '+@strOrderType
END
END
EXEC sp_executesql @strCount,N'@TotalCount INT OUTPUT',@TotalCount OUTPUT
IF @TotalCount%@PageSize=0
BEGIN
SET @TotalPage=@TotalCount/@PageSize
END
ELSE
BEGIN
SET @TotalPage=@TotalCount/@PageSize+1
END
SET NOCOUNT ON
EXEC (@strSql)
END
SET NOCOUNT OFF
GO
...全文
120 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lllyyymmm 2007-11-03
  • 打赏
  • 举报
回复
daijun17 说的没错,一控制不方便,二如果数据有什么问题,就全部不能取出来,在ASP。NET来说,它可以把不符合条件或有问题的数据过滤掉,而不会说一条数据都没有
xjc55 2007-11-03
  • 打赏
  • 举报
回复
再顶
浪漫幕末 2007-11-02
  • 打赏
  • 举报
回复
你不要把所有的都放在数据库里做,对于asp.net来说.你可以只取出一页的数据给GridView,数据取出来了,利用ado.net来处理数据,所有的都放在数据库里做的话一不安全,二又没有在程序中控制来的方便.
xjc55 2007-11-02
  • 打赏
  • 举报
回复
顶一下

22,298

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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