sql-server - 如果在兼容级别 120 下存在,则删除表
问题描述
我们的生产 SQL Server 在版本 2014 (12.0.6433.1) 上运行,我们的开发 SQL Server 是版本 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 安装。
推荐阅读
- html - 当我尝试向我的主要部分添加背景时,标题被覆盖
- git - Git:如何更改我的本地指向的起源分支?
- php - 如何使用php lighthouse在laravel中添加动态where子句进行graphql处理
- c# - 使用参数传递 @Html.ActionLink 时,引导设计不会在页面上呈现。
- swift - 错误无法使用类型为 '(Range
)' - performance - 为什么 jnz 不计算循环?
- python - pyinstaller exe 识别相对路径但不是绝对路径
- machine-learning - 我需要在最后一层之前添加 ReLU 函数来预测正值吗?
- c# - 将 HTML 站点与 MVC 站点的操作链接
- scala - 调用 scala 方法,将数据帧的每一行作为输入传递