SQL Server兼容性级别不起作用

问题描述:

我们最近遇到了一个问题,即我们的开发团队编写的SQL包括SQL Server 2012/2014的新功能,并且SQL Server 2014在2008 compatibility中运行时允许使用该功能。SQL Server兼容性级别不起作用

当我开发服务器上运行该

EXEC SP_DBCMPTLEVEL '<insert db>' 
GO 

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

它返回

当前兼容级别为100
消息51000,级别16,状态1, 5个线
值匹配

在生产中,相同的SQL显示了这一点:

当前兼容级别是100
消息102,级别15,状态1, 线5附近
'扔' 不正确的语法。

我们还没有升级我们的生产SQL Server,并且正在运行到部署问题。 THROW是SQL Server 2012新增的一个关键字,因此我预计2008服务器会突破语法。看起来兼容级别对我来说是打破了。

可以做些什么来防止在开发环境中允许不兼容的SQL?

+0

您误解兼容性级别。您的代码即使在兼容性级别为90的数据库中也能在SQL Server 2012上运行,但它不会在2012年下的SQL Server上执行 – sepupic

+0

同样的事情是,如果您尝试在SQL Server 2008及更低版本上使用超前/滞后,您将获得一个错误。但是你可以在2012年使用CL 100或甚至90的数据库 – sepupic

根据文档(https://technet.microsoft.com/en-us/library/bb510680(v=sql.110).aspx

兼容性水平提供 SQL Server早期版本的只有部分的向后兼容性。

因此,在引用的链接中,您可以看到什么兼容模式可以影响的列表。

为了避免这种问题,根据经验我的建议是:开发和生产必须是相同的(尽可能)。如果没有,例如在计划升级期间,至少测试环境必须与生产类似。

在过去,我们不得不冻结释放cicle几天(除了关键的bugfix)。