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_NULLS和QUOTED_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




