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 上不可用的主要内容,如果未能解决你的问题,请参考以下文章
线程(c++ 中的并行计算)是不是与优化级别(gcc)不兼容?