SQL Server兼容级别120未阻止高版本语法执行问题咨询
SQL Server兼容级别是否会拦截高版本新增语法?
设置SQL Server数据库兼容级别为120(对应SQL Server 2014版本)不会阻止高版本数据库引擎新增的语法运行,你遇到的开发环境执行成功、生产环境报错的情况是兼容级别的正常设计逻辑。
兼容级别的作用边界
- 兼容级别的核心设计目标是向前兼容,即保证针对旧版本SQL Server编写的业务代码,在新版本数据库引擎上可以正常运行,不会因为新版本对旧有语法的行为调整出现报错,它并不负责把新版本引擎的所有新增特性全部禁用。
- 只有那些存在行为变更的旧有语法,才会受兼容级别控制。比如SQL Server 2016对某些旧有函数的返回值逻辑做了调整,设置兼容级别120就会让这些函数保持2014版本的行为,但完全新增的语法不在兼容级别的控制范围内。
你遇到的DROP TABLE IF EXISTS语法的情况
你用到的DROP TABLE IF EXISTS是SQL Server 2016版本才正式引入的全新语法,该语法不存在和旧版本的行为冲突,因此不受兼容级别120的限制:
CREATE TABLE [dbo].[Compatability120_TEST] (ID INT) GO DROP TABLE IF EXISTS [dbo].[Compatability120_TEST] GO
只要你连接的数据库引擎是2016及以上版本(你开发环境是2019,满足要求),哪怕数据库兼容级别设为120,这段代码都可以正常执行。但生产环境引擎是2014,根本不识别这个语法,所以会直接报错。
避免这类问题的方案
- 最稳妥的方式是开发、测试、预发环境全部使用和生产环境完全一致的SQL Server版本,不要仅依赖兼容级别模拟生产环境。
- 如果必须用高版本引擎做开发,可以在数据库项目配置中设置目标平台为SQL Server 2014,编写代码时IDE会自动拦截不符合目标版本的语法。
- 所有上线脚本必须在和生产版本一致的预发环境提前执行验证,确认无问题后再在生产执行。
内容的提问来源于stack exchange,提问作者benni_mac_b
相关产品推荐
相关产品推荐

