急问:下面的存储过程在返回第2页时出错,

lovelxj 2006-08-31 04:12:53
查第1页时正常,第2页错误。。。。
**********提示错误:
服务器: 消息 147,级别 16,状态 2,行 1
[Microsoft][ODBC SQL Server Driver][SQL Server]聚合不应出现在 WHERE 子句中,除非该聚合位于 HAVING 子句或选择列表所包含的子查询中,并且要对其进行聚合的列是外部引用。

@RETURN_VALUE = N/A

**** 本来想在查询分析器中把执行的SQL语句打印出来看看,结果只输出SQL语句的前一部分,有没有好的方法可以输出全部SQL的呢?


SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO



ALTER proc dbo.Up_SysGetObjectPageListTest
--分页存储过程,多返回一行
--分页存储过程
@TableName nvarchar(255) , -- 表名
@GetFields nvarchar(1000) = '*', -- 需要返回的列
@OrderFieldName nvarchar(255)='', -- 排序的字段名
@strWhere nvarchar(1500) = '', -- 查询条件 (注意: 不要加 where) ,格式为 " and a = b "
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@OrderType int = 0, -- 设置排序类型, 非 0 值则降序
@IsCount bit = 0 -- 设置是否统计,如果为真,则不返回数据集合,而是返回中选记录总数,反之则只返回数据集合
AS
declare @strSQL nvarchar(4000) -- 主语句
declare @strTmp nvarchar(110) -- 临时变量
declare @strOrder nvarchar(400) -- 排序类型



begin

if @strWhere <> ''
set @strWhere = ' 1=1 '+@strWhere
else
set @strWhere = ' 1=1 '

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

if @PageIndex = 1
set @strSQL = 'select top ' + ltrim(str(@PageSize)) +' ' + @GetFields +' from ' + @TableName + ' where ' + @strWhere + @strOrder
--如果是第一页就执行以上代码,这样会加快执行速度

else
begin
--以下代码赋予了@strSQL以真正执行的SQL代码
if @strWhere != ''
set @strSQL = 'select top ' + ltrim(str(@PageSize)) +' ' +@GetFields +' from '
+ @TableName + ' where '+ @strWhere + ' and ' + @OrderFieldName + @strTmp + '('
+ @OrderFieldName + ') from (select top ' + ltrim(str((@PageIndex-1)*@PageSize)) + ' '
+ @OrderFieldName + ' from ' + @TableName + ' where ' + @strWhere
+ @strOrder + ') as tblTmp) ' + @strOrder
else
set @strSQL = 'select top ' + str(@PageSize) +@GetFields +' from '
+ @TableName + ' where ' + @OrderFieldName + @strTmp + '('+ @OrderFieldName + ') from (select top ' + str((@PageIndex)*@PageSize) + @OrderFieldName + ' from ' + @TableName + @strOrder + ') as tblTmp)'+ @strOrder
end
end
--select @strSQL
exec (@strSQL)

if @IsCount=1
exec('select count(*) from ' + @TableName + ' where ' + @strWhere )

return




GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

...全文
224 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
specialsoldier 2006-08-31
  • 打赏
  • 举报
回复
自问自答 好~
simonhehe 2006-08-31
  • 打赏
  • 举报
回复
^_^ gx LZ,不用帮手了
lovelxj 2006-08-31
  • 打赏
  • 举报
回复
问题已经解决。。
是多表查询时,别名在2个表中都有。。
lovelxj 2006-08-31
  • 打赏
  • 举报
回复
没有group by,也没有 having啊
vfssqs 2006-08-31
  • 打赏
  • 举报
回复
[Microsoft][ODBC SQL Server Driver][SQL Server]聚合不应出现在 WHERE 子句中,除非该聚合位于 HAVING 子句或选择列表所包含的子查询中,并且要对其进行聚合的列是外部引用

这样的问题只能告诉楼主你的@sqlWhere 放错了地方又么放在group by 的前面如果是后面的话
用having
lovelxj 2006-08-31
  • 打赏
  • 举报
回复
补充下, 是在多表查询时出错的。。。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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