SQL Server 2012与2014中MERGE关键字调用存储过程报错原因及解决
SQL Server 2012与2014存储过程调用差异的原因及解决方案
原因分析
- 保留关键字解析逻辑升级:
MERGE是SQL Server 2008及后续版本的保留关键字。在SQL Server 2012中,当数据库兼容级别设为90(对应SQL Server 2005)时,查询解析器对保留关键字的校验较为宽松,允许未加引号的merge作为字符串参数传递;但SQL Server 2014的解析器即使在兼容级别90的环境下,对保留关键字的校验更严格,会直接将裸写的merge识别为SQL语法关键字,而非存储过程的字符串参数,因此触发语法错误。 - 兼容级别的作用边界:兼容级别主要影响查询优化器行为、旧版语法兼容性,但无法完全覆盖新版本的核心语法解析规则。SQL Server 2014的解析器底层逻辑已更新,不会因兼容级别回退就放松对保留关键字的识别。
解决方案
- 规范字符串参数写法:调用存储过程时,必须给字符串类型的参数值加单引号,即写成
SP_AddState 29,'merge',明确告知解析器这是字符串常量而非SQL关键字。 - 备选方案(不推荐):若场景允许,也可以用方括号包裹关键字,写成
SP_AddState 29,[merge],但这种方式仅适用于特定标识符场景,通用性不如单引号,建议优先使用单引号写法。
内容的提问来源于stack exchange,提问作者Sagar Shirke
相关产品推荐
相关产品推荐

