使用sp_executesql执行带group by子句的SQL结果异常如何解决
问题根因
你遇到的异常和sp_executesql、group by本身没有关系,问题出在动态SQL的拼接逻辑上:
你写的cast(count('phonenumbertypeid') as nvarchar(100))是在拼接@SQLStatement字符串的阶段就提前执行了,而不是随着动态SQL一起执行。这里count的参数是固定字符串'phonenumbertypeid',外层执行时没有分组条件,count固定返回1,你最终拼接出来的实际执行SQL是:
select 1 from person.personphone group by phonenumbertypeid
执行后每行结果都是1,自然不符合预期。
解决方法
把count统计、cast转换的逻辑整体放到动态SQL的字符串内部,保证计算逻辑在动态SQL执行阶段才运行,和你直接执行的SQL逻辑保持一致即可,正确写法如下:
declare @SQLStatement nvarchar(1000); set @SQLStatement='select cast(count(phonenumbertypeid) as nvarchar(100)) from person.personphone group by phonenumbertypeid' exec sp_executesql @SQLStatement
如果后续有动态传入统计字段、过滤条件的需求,建议使用sp_executesql的参数传递能力,不要直接拼接SQL字符串,既可以避免这类执行时机错误,也能防范SQL注入风险。
内容的提问来源于stack exchange,提问作者Vikram Singh
相关产品推荐
相关产品推荐

