uniQuery中,同一个参数前后出现两次,会被当做两个不同的参数,从而导致Group by语句报错,如何使其被认定为同一个参数?

weixin_37639870 2024-09-22 13:11:10

uniQuery中,同一个参数前后出现两次,会被当做两个不同的参数,从而导致Group by语句报错,如何使其被认定为同一个参数?如下:
select substring(NC3_HZ_ID,1,:iLen) as ID,
  count(*) as CNT_HZ_Z , 
  sum(NC3_HZ_CBMJ) as CBMJ 
from NC3_HZ
where  NC3_HZ_SFJD='Y'
and (NC3_HZ_ID like '320600102201%')
group by substring(NC3_HZ_ID,1,:iLen)

然后对参数iLen赋值为12,结果uniQuery提交到后台的语句变成
exec sp_executesql N'select substring(NC3_HZ_ID,1,@P1) as ID,
  count(*) as CNT_HZ_Z , 
  sum(NC3_HZ_CBMJ) as CBMJ 
from NC3_HZ
where  NC3_HZ_SFJD=''Y''
and (NC3_HZ_ID like ''320600102201%'')
group by substring(NC3_HZ_ID,1,@P2)',N'@P1 int,@P2 int',12,12
报错
消息 8120,级别 16,状态 1,第 1 行
选择列表中的列 'NC3_HZ.NC3_HZ_ID' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。
有没有办法可以直接避免?

当然实在没办法可以用SQL语句拼接字符串的方式,不用参数赋值。但是这种语句较多,有没有其他办法可以直接避免这种问题?

...全文
89 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
BlueStorm 09-26
  • 打赏
  • 举报
回复

今天看了一下unidac, 似乎并不支持DirectExecute方式。
如果你坚持使用unidac, 你可以把你的查询语句改一下,只使用一个参数Len,这样就不会报错了:

with tmp as 
 (select substring(NC3_HZ_ID,1, :Len) as ID, NC3_HZ_CBMJ
    from NC3_HZ
    where NC3_HZ_SFJD='Y'
        and (NC3_HZ_ID like '320600102201%')
 )
 select ID, count(*) as CNT_HZ_Z,  sum(NC3_HZ_CBMJ) as CBMJ
   from tmp
   group by ID;

看看对你有没有帮助?

  • 打赏
  • 举报
回复

不要使用同样的参数名,比如一个叫iLen,另一个叫iLen2,可以传进同样的值,不影响使用。



BlueStorm 09-25
  • 打赏
  • 举报
回复

FireDAC有直接执行模式(DirectExectue), 不会转换成exec sp_executesql这种方式执行, 你看一下unidac的没有这种方式

5,713

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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