SQL Server 兼容性级别无效

5
我们最近遇到了一个问题,开发团队编写的SQL包含了SQL Server 2012/2014的新特性,但在运行2008 compatibility的SQL Server 2014上仍然被允许执行。
当我在开发服务器上运行时,
EXEC SP_DBCMPTLEVEL '<insert db>'
GO

IF 1=1
    THROW 51000, 'values match', 1; 
GO

它返回这个

当前兼容级别为100。
Msg 51000,级别16,状态1,第5行
值匹配

在生产中,相同的SQL显示如下:

当前兼容级别为100。
Msg 102,级别15,状态1,第5行
'THROW'附近有语法错误。

我们尚未升级我们的生产SQL Server,遇到了部署问题。THROW是SQL Server 2012中新的关键字,因此我预计2008服务器会在语法上出现错误。对我来说,兼容性级别似乎已经损坏。

有什么方法可以防止不兼容的SQL在开发环境中被允许?


你误解了兼容级别。你的代码将在兼容级别为90的数据库上运行于SQL Server 2012,但它将无法在低于2012版本的SQL Server上执行。 - sepupic
如果你尝试在SQL Server 2008及以下版本中使用lead/lag,同样会出现错误。但是在2012年的数据库上下文中,您可以在CL 100甚至90上使用它们。 - sepupic
1个回答

2
根据文档(https://technet.microsoft.com/zh-cn/library/bb510680(v=sql.110).aspx),兼容级别仅提供与早期版本的 SQL Server 的部分向后兼容性。
因此,在引用的链接中,您可以看到兼容模式可能会影响的列表。
为避免这种问题,我的建议是:开发和生产环境必须尽可能相同。如果不同,在计划升级期间,至少测试环境必须类似于生产环境。
在过去,我们不得不冻结发布周期几天(除了关键的错误修复)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接