如何以编程方式确定SQL Server实例的最高或默认兼容级别?
如何编程确定SQL Server实例的最高兼容级别并设置为实例默认值
一、确定实例支持的最高/默认兼容级别
实例的默认兼容级别等同于model系统数据库的兼容级别(model是所有新建数据库的模板库,其级别由实例版本直接决定),直接查询即可:
SELECT compatibility_level AS instance_default_compatibility_level FROM sys.databases WHERE name = 'model';
这个方法比解析版本号更可靠,无需维护版本映射规则,能适配所有SQL Server版本。
二、批量将数据库兼容级别设为实例默认值
可以通过动态SQL实现,自动获取实例默认级别并应用到目标数据库:
-- 1. 获取实例默认兼容级别 DECLARE @default_compat INT; SELECT @default_compat = compatibility_level FROM sys.databases WHERE name = 'model'; -- 2. 定义要处理的数据库(排除系统库,可按需调整) DECLARE @db_list TABLE (db_name NVARCHAR(128)); INSERT INTO @db_list SELECT name FROM sys.databases WHERE name NOT IN ('master', 'model', 'msdb', 'tempdb') AND state_desc = 'ONLINE'; -- 仅处理在线数据库 -- 3. 遍历数据库并更新兼容级别 DECLARE @current_db NVARCHAR(128); DECLARE db_cursor CURSOR FOR SELECT db_name FROM @db_list; OPEN db_cursor; FETCH NEXT FROM db_cursor INTO @current_db; WHILE @@FETCH_STATUS = 0 BEGIN DECLARE @sql NVARCHAR(MAX); SET @sql = N'ALTER DATABASE ' + QUOTENAME(@current_db) + N' SET COMPATIBILITY_LEVEL = ' + CAST(@default_compat AS NVARCHAR(10)) + N';'; EXEC sp_executesql @sql; FETCH NEXT FROM db_cursor INTO @current_db; END CLOSE db_cursor; DEALLOCATE db_cursor;
注意事项
- 执行此脚本需要
ALTER ANY DATABASE或对应数据库的ALTER DATABASE权限 - 更改兼容级别后,建议检查数据库兼容性:
- 用
sys.dm_db_persisted_sku_features查看依赖旧版本特性的对象 - 运行业务查询测试,确保现有逻辑不受影响
- 用
- 该脚本会自动适配不同版本的SQL Server实例,不会强制设置超出实例支持的级别,完全兼容旧版SQL Server客户的环境
内容的提问来源于stack exchange,提问作者Emperor Eto
相关产品推荐
相关产品推荐

