网上找了段分页存储过程,基本上很好用,用了几个项目了都没问题
但是今天的一个项目不知道怎么回事,报错了
错误信息:聚合不应出现在 WHERE 子句中,除非该聚合位于 HAVING 子句或选择列表所包含的子查询中,并且要对其进行聚合的列是外部引用。
代码如下:CREATE PROCEDURE GetRecordFromPage
@tblName varchar(255), -- 表名
@strSelect varchar(2000), --查询字段
@fldName varchar(255), -- 字段名以主键值
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(2000) = '' -- 查询条件 (注意: 不要加 where)
AS declare @strSQL varchar(6000) -- 主语句
declare @strTmp varchar(5000) -- 临时变量
declare @strOrder varchar(500) -- 排序类型 if @OrderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = ' order by ' + @fldName +' desc'
end
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by ' + @fldName +' asc'
end
set @strSQL = 'select top ' + str(@PageSize) + @strSelect + ' from '
+ @tblName + ' where ' + @fldName + @strTmp + '('
+ @fldName + ') from (select top ' + str((@PageIndex-1)*@PageSize)
+ @fldName + ' from ' + @tblName + @strOrder + ') as tblTmp)'
+ @strOrder
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) + @strSelect + ' from '
+ @tblName + ' where ' + @fldName + @strTmp + '('
+ @fldName + ') from (select top ' + str((@PageIndex-1)*@PageSize)
+ @fldName + ' from ' + @tblName + ' where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder if @PageIndex = 1
begin
set @strTmp = ' '
if @strWhere != ''
set @strTmp = ' where (' + @strWhere + ')' set @strSQL = 'select top ' + str(@PageSize) + @strSelect + ' from '
+ @tblName + @strTmp + ' '+ @strOrder
end --print @strSQL
exec (@strSQL)
GO麻烦高手指出
但是今天的一个项目不知道怎么回事,报错了
错误信息:聚合不应出现在 WHERE 子句中,除非该聚合位于 HAVING 子句或选择列表所包含的子查询中,并且要对其进行聚合的列是外部引用。
代码如下:CREATE PROCEDURE GetRecordFromPage
@tblName varchar(255), -- 表名
@strSelect varchar(2000), --查询字段
@fldName varchar(255), -- 字段名以主键值
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(2000) = '' -- 查询条件 (注意: 不要加 where)
AS declare @strSQL varchar(6000) -- 主语句
declare @strTmp varchar(5000) -- 临时变量
declare @strOrder varchar(500) -- 排序类型 if @OrderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = ' order by ' + @fldName +' desc'
end
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by ' + @fldName +' asc'
end
set @strSQL = 'select top ' + str(@PageSize) + @strSelect + ' from '
+ @tblName + ' where ' + @fldName + @strTmp + '('
+ @fldName + ') from (select top ' + str((@PageIndex-1)*@PageSize)
+ @fldName + ' from ' + @tblName + @strOrder + ') as tblTmp)'
+ @strOrder
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) + @strSelect + ' from '
+ @tblName + ' where ' + @fldName + @strTmp + '('
+ @fldName + ') from (select top ' + str((@PageIndex-1)*@PageSize)
+ @fldName + ' from ' + @tblName + ' where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder if @PageIndex = 1
begin
set @strTmp = ' '
if @strWhere != ''
set @strTmp = ' where (' + @strWhere + ')' set @strSQL = 'select top ' + str(@PageSize) + @strSelect + ' from '
+ @tblName + @strTmp + ' '+ @strOrder
end --print @strSQL
exec (@strSQL)
GO麻烦高手指出
解决方案 »
- powerdesigner 生成mysql表的问题
- SQL查询汇总金额为指定大小的数据集,高手指教!
- xp安装sql2005之后无法连接到本机电脑
- 保存查询结果
- 如何将一台server上的sql数据库全部复制到另一台server上
- 连接池问题 [ADODB 连接SQL Server 2005 问题]
- 请问我在程序中建立的表和添加的记录怎么在数据库中没有修改成功(新手菜鸟)
- 再次跪求一SQL语句,把剩下的家底全送了
- 问一个sql server问题
- 求助 win10安装了SQL server2014 版本的,但没有登录界面
- SQL Server 2000与VB6.0建立的数据库系统中所遇到的问题
- 存储过程传值
如
select sum(col)
from tb
where sum(col)>0
是不对的
select sum(col)
from tb
group by col
having sum(col)>0
就是对的
@TableName varchar(5000), --表名
@Fields varchar(5000) = '*', --字段名(全部字段为*)
@OrderField varchar(5000), --排序字段(必须!支持多字段)
@SqlWhere varchar(8000) = Null, --条件语句(不用加where)
@PageSize int, --每页多少条记录
@PageIndex int = 1 , --指定当前为第几页
@TotalRecord int output, --总记录数
@TotalPage int output --返回总页数
as
begin Declare @sql nvarchar(max); --计算总记录数
if (@SqlWhere='' or @SqlWhere=NULL)
set @sql = 'select @TotalRecord = count(*) from ' + @TableName
else
set @sql = 'select @TotalRecord = count(*) from ' + @TableName + ' where 1=1 ' + @SqlWhere EXEC sp_executesql @sql,N'@TotalRecord int OUTPUT',@TotalRecord OUTPUT--计算总记录数
--计算总页数
select @TotalPage=CEILING((@TotalRecord+0.0)/@PageSize) --处理页数超出范围情况
if @PageIndex<=0
Set @PageIndex = 1
if @PageIndex>@TotalPage
Set @PageIndex = @TotalPage
if @PageIndex=1
begin
if (@SqlWhere='' or @SqlWhere=NULL)
set @sql = 'select top ' + str(@PageSize) +' '+@Fields+ ' from ' + @TableName + ' order by '+ @OrderField
else
set @sql = 'select top ' + str(@PageSize) +' '+@Fields+ ' from ' + @TableName + ' Where 1=1 ' + @SqlWhere +' order by '+ @OrderField
end
else
begin
if (@SqlWhere='' or @SqlWhere=NULL)
set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName
else
set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName + ' where 1=1' + @SqlWhere --处理开始点和结束点
Declare @StartRecord int
Declare @EndRecord int
set @StartRecord = (@PageIndex-1)*@PageSize + 1
set @EndRecord = @StartRecord + @PageSize -1
--继续合成sql语句
set @Sql = @Sql + ') as tbl where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' + Convert(varchar(50),@EndRecord)
--print @Sql
end Exec(@Sql)
end
谢谢3楼提供的分页存储过程,不过ROW_NUMBER()好象只支持SQL2005?
我的是2000的呵呵