OPENJSON 在兼容级别设置为 130 的 SQL Server 2016 上不可用

Posted

技术标签:

【中文标题】OPENJSON 在兼容级别设置为 130 的 SQL Server 2016 上不可用【英文标题】:OPENJSON not available on SQL Server 2016 with compatibility level set to 130 【发布时间】:2019-07-19 13:07:07 【问题描述】:

我正在尝试在 SQL Server 2016 上运行的数据库中使用 OPENJSON,并在运行这个简单的测试查询时出现以下错误(在不同的 2016 数据库上运行良好)

select * from OPENJSON(' "test": "test" ')

Invalid object name 'OPENJSON'.

我知道兼容性级别设置,但在此数据库上似乎并非如此。它的兼容级别已经设置为 130。这个特定的数据库是从旧的 2008R2 数据库迁移而来的。我们还需要做些什么来访问OPENJSON 函数吗?

编辑

作为测试,我在同一个数据库服务器上创建了一个新的空数据库,上面的查询工作正常。所以数据库服务器似乎不是问题,它与我们迁移的一个数据库有关。

如果这很重要,我以SA 帐户连接。

【问题讨论】:

什么是select @@VERSION @MartinSmith Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) Oct 28 2016 18:17:30 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows Server 2016 Standard 6.3 <X64> (Build 14393: ) (Hypervisor) 听起来数据库确实不兼容 130。SELECT compatibility_level FROM sys.databases WHERE name = 'YourDatabase'; 返回什么? @Larnu SELECT compatibility_level FROM sys.databases WHERE name = 'MyDB'; 返回 130 针对我创建的新空测试数据库的相同查询也返回 130 感谢@Larnu 和 Martin Smith 的帮助......这真的很奇怪和莫名其妙 【参考方案1】:

通过 SSMS gui 和运行 SELECT compatibility_level FROM sys.databases WHERE name = 'MyDB';,数据库报告的兼容级别为 130

除了测试之外,我运行了 ALTER DATABASE MyDB SET COMPATIBILITY_LEVEL = 130 ,现在一切正常。我不知道是什么原因造成的。

编辑

我想我现在知道是什么导致了这种奇怪的行为。表现出这种行为的数据库是每天早上通过从 prod 数据库复制创建的开发数据库。经过更多研究,prod 数据库没有设置为兼容级别 130,而是 100。我在想,当复制发生并从 prod 日志文件恢复 dev 数据库时,即使 dev db 设置为 130,有些东西两者之间不匹配。从那以后,我也将 prod 提高到了 130,并且一切都应该很好。

【讨论】:

以上是关于OPENJSON 在兼容级别设置为 130 的 SQL Server 2016 上不可用的主要内容,如果未能解决你的问题,请参考以下文章

更改SQL 2005数据库的兼容级别对数据库有影响吗

SQL Server 兼容级别

线程(c++ 中的并行计算)是不是与优化级别(gcc)不兼容?

如何反转 SQL Server 中的 OPENJSON() 函数?

如何使用 OpenJson 将 JSON 列标题转换为小写

是否可以在 SQL Server 中使用通配符作为 OPENJSON 的参数?