网上找了段分页存储过程,基本上很好用,用了几个项目了都没问题
但是今天的一个项目不知道怎么回事,报错了
错误信息:聚合不应出现在 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麻烦高手指出

解决方案 »

  1.   

    提示很明显

    select sum(col)
    from tb
    where sum(col)>0 
    是不对的
    select sum(col)
    from tb
    group by col
    having sum(col)>0
    就是对的
      

  2.   

    CREATE Procedure [dbo].[Common_Page] 
     @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.   

    我知道哪里错了,是我用了关联查询,min()函数里面不能用min(a.CreatTime)
    谢谢3楼提供的分页存储过程,不过ROW_NUMBER()好象只支持SQL2005?
    我的是2000的呵呵