如何让SQL Server 2019设置compatibility_level 110后完全兼容SQL Server 2012?
让SQL Server 2019完全模拟SQL Server 2012行为的解决方案
1. 确认并锁定数据库兼容级别
你已设置compatibility_level = 110,可再次执行语句确保配置生效:
ALTER DATABASE [你的数据库名] SET COMPATIBILITY_LEVEL = 110; GO
2. 配置查询优化器的旧版行为
兼容级别仅控制部分行为,需额外调整数据库范围的优化器参数,对齐SQL Server 2012的执行逻辑:
-- 启用SQL Server 2012的基数估计器 ALTER DATABASE SCOPED CONFIGURATION SET LEGACY_CARDINALITY_ESTIMATION = ON; -- 将查询优化器兼容级别设为110(匹配SQL Server 2012) ALTER DATABASE SCOPED CONFIGURATION SET QUERY_OPTIMIZER_COMPATIBILITY_LEVEL = 110; -- 禁用严格检查,允许旧版语法与行为 ALTER DATABASE SCOPED CONFIGURATION SET DISABLE_STRICT_CHECKS = ON; GO
3. 模拟TRIM函数的不支持行为
SQL Server 2019的实例级别会默认支持TRIM函数,不受兼容级别限制。要模拟SQL Server 2012(无TRIM函数)的报错效果,可在目标数据库中创建同名用户定义函数触发错误:
CREATE FUNCTION dbo.TRIM(@input VARCHAR(MAX)) RETURNS VARCHAR(MAX) AS BEGIN RAISERROR('TRIM function is not supported in SQL Server 2012', 16, 1); RETURN NULL; END; GO
执行后调用SELECT TRIM(' FOO ')会抛出错误,与SQL Server 2012行为一致。若需恢复正常使用TRIM,删除该函数即可:
DROP FUNCTION dbo.TRIM; GO
4. 对齐数据库默认配置
确保数据库基础选项与SQL Server 2012默认值一致:
ALTER DATABASE [你的数据库名] SET ANSI_NULLS ON; ALTER DATABASE [你的数据库名] SET QUOTED_IDENTIFIER ON; ALTER DATABASE [你的数据库名] SET ANSI_PADDING ON; ALTER DATABASE [你的数据库名] SET ANSI_WARNINGS ON; ALTER DATABASE [你的数据库名] SET ARITHABORT ON; GO
内容的提问来源于stack exchange,提问作者Ivan Lex K.
相关产品推荐
相关产品推荐

