我在 SQL Server 2012 中调用存储过程(如下所述)时遇到运行时错误,但在 SQL Server 2014 中却没有,它看起来非常基本,但想知道确切的原因以及是否有解决方法。
在 SQL Server 2012 中运行
SP_AddState 29,merge
在 SQL Server 2014 中给出错误为
System.Data.SqlClient.SqlException(0x80131904):附近语法不正确 关键字“合并”。
仅当调用为时才有效
SP_AddState 29,'merge'
那么这种执行行为的原因是什么?
MERGE
运算符于 2008 年添加到 SQL Server,同时,MERGE
被设为 保留关键字。因此,当使用带有值 MERGE
的 unquoted文字时,将被视为
MERGE
运算符的开始,而使用 EXEC
时不允许这样做。
虽然它是在 2008 年添加的(并且您正在使用 2012 年),但如果您使用旧的兼容级别(90 或更低),则该关键字可能不会被视为一个,因为它不是 SQL 中的保留关键字Server 2005。这可以解释为什么您在 SQl Server 2012 和 2014 中得到不同的行为。
当然,实际上,您真的不应该再使用兼容性 90(同样,这就是 SQL Server 2005!),甚至是 SQL Server 2012(两年前就已停止使用),甚至 2014 年也已结束*不到个月的生活。另外,虽然语法 EXEC <ProcName> (@ParameterName = ) <Literal>
是允许的,但你
真的不应该将它用于字符串;使用字符串 字符串文字;
'nmerge'
是您应该使用的语法。这可以避免上述问题,以及如果您有其他保留关键字,或者您有一个需要分隔的字符串(以数字开头,具有非字母数字字符等)。