SQL动态查询报错:非列名的值被识别为无效列名的解决方法
问题根因
你遇到的报错是因为拼接动态SQL时,字符串、日期类型的变量没有被包裹单引号,导致SQL解析器把Headquarters识别成列名而非字符串常量:
- 你原代码拼接
WHERE LocationName='+@LocationNameFromApp+'时,最终生成的动态SQL条件为WHERE LocationName=Headquarters,缺少字符串必需的单引号标记 - 同理两个日期变量
@SDstr、@EDstr也没有加单引号,即使修复了位置名称的问题,后续也会报日期相关的语法错误
修复方案
修改动态SQL拼接WHERE条件的部分,用两个连续单引号作为转义,给字符串和日期变量两侧加上单引号即可:
-- 把原来的WHERE行替换为下面的写法 WHERE LocationName='''+@LocationNameFromApp+''' AND FullDateUSA >= '''+@SDstr+''' AND FullDateUSA <= '''+@EDstr+'''
额外优化建议
当前直接拼接用户传入的@LocationNameFromApp参数存在SQL注入风险,推荐改用sp_executesql带参数执行动态SQL,安全性更高:
- 将动态查询里的变量通过参数传入,不需要手动处理单引号转义
- 可以避免特殊字符导致的语法错误和注入攻击
内容的提问来源于stack exchange,提问作者Cody
相关产品推荐
相关产品推荐

