5,713
社区成员
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语句拼接字符串的方式,不用参数赋值。但是这种语句较多,有没有其他办法可以直接避免这种问题?
今天看了一下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,可以传进同样的值,不影响使用。
FireDAC有直接执行模式(DirectExectue), 不会转换成exec sp_executesql这种方式执行, 你看一下unidac的没有这种方式