存储过程为:
ALTER PROCEDURE news_Showlist
(
@tblName   varchar(255),       -- 表名
@strGetFields varchar(1000),  -- 需要返回的列
@fldName varchar(255),      -- 排序的字段名
@PageSize   int ,          -- 页尺寸
@PageIndex  int ,           -- 页码
@strWhere  varchar(1500),  -- 查询条件(注意: 不要加where)
@Sort varchar(255)       --排序的方法)
AS
declare @strSQL   varchar(5000)       -- 主语句
declare @strTmp   varchar(110)        -- 临时变量
declare @strOrder varchar(400)        -- 排序类型if @Sort = 'desc'
begin
set @strTmp = '<(select min'
set @strOrder = ' order by ' + @fldName +' desc'
--如果@OrderType不是,就执行降序,这句很重要!
end
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by ' + @fldName +' asc'
end
 
if @PageIndex = 1
begin
if @strWhere != ''   
  begin
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from ' + @tblName + ' where ' + @strWhere + ' ' + @strOrder
  end
else
  begin
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from '+ @tblName + ' '+ @strOrder
  end
--如果是第一页就执行以上代码,这样会加快执行速度
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
 
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
print @strSQL
exec (@strSQL)
RETURN-------------------------------------------------------
调用时用的是多表查询,inner join
出错提示为:[Microsoft][ODBC SQL Server Driver][SQL Server]聚合不应出现在 WHERE 子句中,除非该聚合位于 HAVING 子句或选择列表所包含的子查询中,并且要对其进行聚合的列是外部引用。当到第二页是,执行的@strSQL为:
@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请问是怎么回事,该怎么修改?

解决方案 »

  1.   

    其实,我可以把问题内容简化一下,如下:
    调用存储过程时用的是多表查询,inner join
    出错提示为:[Microsoft][ODBC SQL Server Driver][SQL Server]聚合不应出现在 WHERE 子句中,除非该聚合位于 HAVING 子句或选择列表所包含的子查询中,并且要对其进行聚合的列是外部引用。当到第二页是,执行的@strSQL为:
    @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请问是怎么回事,该怎么修改?
      

  2.   


    出错提示为:[Microsoft][ODBC SQL Server Driver][SQL Server]聚合不应出现在 WHERE 子句中,
    除非该聚合位于 HAVING 子句或选择列表所包含的子查询中,并且要对其进行聚合的列是外部引用。---------
    是不是where 后面加了 sum之类的聚合函数阿?
      

  3.   

    是啊,加了min的?
    怎么办?
      

  4.   

    提示也说得清楚了:
    把有min的语句放到having 里面min是不应许放到where中的
      

  5.   

    格式如:where 1=1 and 2=2
    having min(fields)=1
    group by id ...
      

  6.   

    如果你的条件里面都有min之类的话 就加个
    having 
    不然这个分页通用性不高的
    应该专门写
      

  7.   

    @strWhere  varchar(1500),  -- 查询条件(注意: 不要加where)
    @strHaving varchar(200),   --加个having 条件,把有min之类的放进来,当然必须有 group by要不你贴print(@strSQL)的结果出来
      

  8.   

    可是为什么单表查询的时候不用having就可以呢?
      

  9.   

    min ,max 之类的聚合函数作为查询条件只能放在HAVING子句中 
    DO U UNDERSTAND?
      

  10.   

    要不你贴print(@strSQL)的结果出来
    ------------------------select top 15 Per_salerec.re_price, Per_salerec.re_kind, Per_salerec.re_content, Per_salerec.re_time, Per_class.cl_name, Per_salerec.re_pay, Per_salerec.re_id,Per_salerec.re_sta, Per_salerec.cl_id, Per_salerec.re_statue  from Per_salerec INNER JOIN Per_class ON Per_salerec.cl_id = Per_class.cl_id 
    where Per_salerec.re_id<(select min(Per_salerec.re_id) from (select top 15 Per_salerec.re_id  from Per_salerec INNER JOIN Per_class ON Per_salerec.cl_id = Per_class.cl_id where Per_salerec.p_id = 31  order by Per_salerec.re_id desc) as tblTmp) and Per_salerec.p_id = 31  order by Per_salerec.re_id desc
      

  11.   


    exec news_Showlist 'AllTableData','TableName,ColOrder','TableName',10,4,'',''
    我测试的没问题。。
    不过聚集函数其用法要注意其用法