DROP TABLE IF EXISTS 在兼容级别 120 下

DROP TABLE IF EXISTS under compatibility level 120

我们的生产 SQL 服务器 运行 版本为 2014 (12.0.6433.1),我们的开发 SQL 服务器版本为 2019 (15.0.4033.1)。

开发数据库设置为兼容级别120以模拟生产。针对 dev 数据库开发的脚本在生产中失败,因为该语法仅在 SQL Server 2016 中引入。

下面的示例在 SSMS (18.5) 中针对兼容级别 120 的开发数据库执行,尽管它被引入 SQL Server 2016 版本。

CREATE TABLE [dbo].[Compatability120_TEST] (ID INT)
GO

DROP TABLE IF EXISTS [dbo].[Compatability120_TEST]
GO

设置兼容性级别是否应该阻止它在开发中工作?

没有。兼容性级别的目的不是提供旧版本的 100% 仿真。 DROP TABLE IF EXISTS 之前没有需要保留向后兼容性的行为,因此允许这样做。这通常很有用,因为它允许您在新代码中使用新语法。看来您需要一个配置为 prod 的测试预生产环境。

如果您想要正确的版本检查,请使用数据库项目。将目标版本设置为 2016 将检查那里不支持的语法(并且构建项目将生成一个仅使用 2016 语法的脚本——除了一些错误)。如果您需要更可靠的测试,您还可以使用正确版本的 LocalDB 安装。