重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛

标题: SQLSERVER2016升级到2019后,修改兼容级别 [打印本页]

作者: mahan    时间: 2026-3-29 21:08
标题: SQLSERVER2016升级到2019后,修改兼容级别
原地升级后,你原有的用户数据库虽然运行在 2019 的引擎上,但它们的“兼容级别”依然停留在 2016(级别 130)。为了让查询优化器能够使用 2019 引入的标量 UDF 内联、批处理模式内存授予反馈等新特性,你需要将其调高。

可以直接在 SSMS 中执行的 T-SQL 脚本。它的作用是自动遍历你当前实例下的所有用户数据库,并将它们的兼容级别批量提升至 150(即 SQL Server 2019)。

为了安全起见,这个脚本内置了过滤条件:它会自动跳过系统自带的数据库(master、tempdb、model、msdb),并且只对状态为“在线 (ONLINE)”的数据库进行操作。

批量升级兼容级别脚本
请在 SSMS 中点击“新建查询”,将以下代码粘贴进去,然后点击“执行”(或按 F5 键):


DECLARE @dbname NVARCHAR(128);
DECLARE @sql NVARCHAR(MAX);

-- 声明游标,筛选需要升级的用户数据库
DECLARE db_cursor CURSOR FOR
SELECT name
FROM sys.databases
WHERE database_id > 4              -- 跳过前4个系统数据库
  AND state_desc = 'ONLINE'        -- 只处理处于在线状态的数据库
  AND compatibility_level < 150;   -- 只处理当前级别低于 2019 (150) 的数据库

OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @dbname;

WHILE @@FETCH_STATUS = 0
BEGIN
    -- 拼接 ALTER DATABASE 语句
    SET @sql = 'ALTER DATABASE [' + @dbname + '] SET COMPATIBILITY_LEVEL = 150;';

    -- 在消息窗口打印正在执行的语句(方便排错和记录)
    PRINT '正在执行: ' + @sql;

    -- 执行该语句
    EXEC sp_executesql @sql;

    FETCH NEXT FROM db_cursor INTO @dbname;
END

CLOSE db_cursor;
DEALLOCATE db_cursor;

PRINT '=======================================================';
PRINT '操作完成:符合条件的用户数据库已成功升级至 150 (SQL Server 2019)。';



如何验证是否成功?
执行完上面的脚本后,你可以再开一个“新建查询”窗口,运行这句简单的查询来检查所有数据库当前的兼容级别:


SELECT name AS [数据库名称], compatibility_level AS [兼容级别]
FROM sys.databases;


(注:列表里 150 代表 2019,130 代表 2016。系统数据库保持默认即可,不需要干预。)






欢迎光临 重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛 (http://bbs.cqsztech.com/) Powered by Discuz! X3.2