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

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 90|回复: 0
打印 上一主题 下一主题

SQLSERVER2016升级到2019后,修改兼容级别

[复制链接]
跳转到指定楼层
楼主
发表于 2026-3-29 21:08:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
原地升级后,你原有的用户数据库虽然运行在 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。系统数据库保持默认即可,不需要干预。)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2026-4-17 22:23 , Processed in 0.261266 second(s), 20 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表