无法使用 OPENJSON 和 SQL Server 2017 解析具有动态键的对象数组

Posted

技术标签:

【中文标题】无法使用 OPENJSON 和 SQL Server 2017 解析具有动态键的对象数组【英文标题】:Can't parsing an array of objects with Dynamic Keys using OPENJSON And SQL Server 2017 【发布时间】:2018-03-15 13:22:24 【问题描述】:

我在使用 SQL Server 2017 解析一组 JSON 文档时遇到了一些问题。

我在文档中遇到了一个嵌套数组(示例如下),它使用动态 ObjectId 即 123 作为对象键,而不是使用静态键(即类别),然后使用单独的键:值来引用 ObjectId。

因此,如果不指定每个单独的对象 ID(有数千个),我就无法使用常规的 CROSS APPLY OPENJSON 语法将项目提取到表中?

有没有一种方法可以在不明确引用每个 ObjectId 的情况下执行此操作,理想情况下我想返回表中的所有产品项目,并且只包含一个带有 categoryId 的字段。

 "ProductItems": 
            "123": [
              
                "item": "13663"
              
            ]
            "124": [
              
                "value": "2336"
              ,
              
                "value": "3667"
                           
            ],
            "453": [
              
                "value": "8667"
              ,
              
                "value": "1956"
              
            ]
          

【问题讨论】:

“ProductItems”级别的括号不应该是方括号,因为它是一个数组吗? 我仔细检查了来源,这反映了那里的内容....如果我说 ProductItems 是一个对象,它有一个包含项目的嵌套类别数组的对象 【参考方案1】:

试试这样的:

DECLARE @x NVARCHAR(MAX)=
'"ProductItems":
"123": [
    
    "item": "13663"
    
],
"124": [
    
    "value": "2336"
    ,
    
    "value": "3667"
                 
],
"453": [
    
    "value": "8667"
    ,
    
    "value": "1956"
    
]
'

SELECT j2.*, j3.* FROM OPENJSON(@x) j1
CROSS APPLY OPENJSON(j1.Value) j2
CROSS APPLY OPENJSON(j2.Value) j3

【讨论】:

以上是关于无法使用 OPENJSON 和 SQL Server 2017 解析具有动态键的对象数组的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SQL Server 中的动态节点加载 OPENJSON

具有深度嵌套数组循环的 SQL 查询 OpenJson

使用 C# 和 OPENJSON 将 JSON 插入 SQL Server 2016

使用 OPENJSON 跳过 OBJECTS 解析 JSON SQL

如何实现 OPENJSON 将 JSON 代码作为列中的文本。如何在 AZURE SQL Dataware House 中的表列上使用 OPENJSON?

OPENJSON 在 SQL Server 中不起作用?