You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SQL Server 2016兼容级别130仍无法使用OPENJSON问题求助

解决OPENJSON报错"Invalid object name 'OPENJSON'"的方案

看起来你遇到的是迁移数据库的典型问题——就算设置了兼容级别130,也没完全适配SQL Server 2016的新功能。既然同一服务器上的新数据库能正常运行OPENJSON,那问题肯定出在迁移过来的数据库配置上,咱们一步步来排查解决:

  • 先确认兼容级别真的生效了
    有时候设置兼容级别后,当前连接可能没刷新配置。先执行这个查询确认:

    SELECT name, compatibility_level 
    FROM sys.databases 
    WHERE name = N'你的数据库名';
    

    如果返回的compatibility_level不是130,重新执行设置命令,然后断开当前连接再重新登录:

    ALTER DATABASE [你的数据库名] SET COMPATIBILITY_LEVEL = 130;
    
  • 检查会话的ANSI设置是否正确
    OPENJSON这类内置JSON函数要求会话的ANSI_NULLSQUOTED_IDENTIFIER必须为ON。先执行这两句开启设置,再测试你的查询:

    SET ANSI_NULLS ON;
    SET QUOTED_IDENTIFIER ON;
    SELECT * FROM OPENJSON('{ "test": "test" }');
    

    如果这样能正常运行,你可以把这些设置设为数据库默认,避免每次手动操作:

    ALTER DATABASE [你的数据库名] SET ANSI_NULLS ON;
    ALTER DATABASE [你的数据库名] SET QUOTED_IDENTIFIER ON;
    
  • 确认数据库不是只读状态
    只读数据库可能会限制一些内置功能的使用,先检查:

    SELECT name, is_read_only 
    FROM sys.databases 
    WHERE name = N'你的数据库名';
    

    如果is_read_only返回1,执行命令改为读写模式:

    ALTER DATABASE [你的数据库名] SET READ_WRITE;
    
  • 检查数据库是否完成了内部版本升级
    从2008R2迁移到2016后,数据库需要完成内部版本升级才能完全支持新功能。先查询数据库内部版本:

    SELECT name, version 
    FROM sys.databases 
    WHERE name = N'你的数据库名';
    

    SQL Server 2016的内部版本是852,如果你的数据库版本低于这个,执行以下命令完成升级(注意先断开其他连接):

    ALTER DATABASE [你的数据库名] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
    DBCC CHECKDB ([你的数据库名]) WITH ALL_ERRORMSGS, DATA_PURITY;
    ALTER DATABASE [你的数据库名] SET MULTI_USER;
    

    完成后再测试OPENJSON。

一般来说,按上面的步骤排查后,问题应该能顺利解决。

内容的提问来源于stack exchange,提问作者mituw16

火山引擎 最新活动