如何使用 openjson 读取存储在 SQL Server 中的 Json 列下方?

Posted

技术标签:

【中文标题】如何使用 openjson 读取存储在 SQL Server 中的 Json 列下方?【英文标题】:How can I read below Json column stored in SQL Server using openjson? 【发布时间】:2019-10-02 17:01:35 【问题描述】:
Declare @ResponseText nvarchar(4000)

set @responseText ='
    "submissions": [
        
        "xml_id":"id_x5d94851726b470.68571510",
        "fields": [ 
            "fieldvalue":"customerEmail@xyzdomain.com","fieldid":"57282490",
            "fieldvalue":"123","fieldid":"57282423",
            "fieldvalue":"12345-678900","fieldid":"57282500", 
            "fieldvalue":"Test Message here ","fieldid":"57282564"
         ]
         
    ]
 '

 SELECT  *
 FROM OPENJSON (@ResponseText, '$.submissions') WITH (
    ID NVARCHAR(100) '$.xml_id',
    $.fields.field NVARCHAR(100) ...
 )

etc 其余的所有记录?字段数组下的其余字段我得到“NULL”

【问题讨论】:

您能否将所需的结果添加到您的问题中? 【参考方案1】:

你可以这样试试:

Declare @ResponseText nvarchar(4000)

set @responseText ='
    "submissions": [
        
        "xml_id":"id_x5d94851726b470.68571510",
        "fields": [ 
            "fieldvalue":"customerEmail@xyzdomain.com","fieldid":"57282490",
            "fieldvalue":"123","fieldid":"57282423",
            "fieldvalue":"12345-678900","fieldid":"57282500", 
            "fieldvalue":"Test Message here ","fieldid":"57282564"
         ]
         
    ]
 '

--查询

 SELECT A.ID
       ,B.*
 FROM OPENJSON (@ResponseText, '$.submissions') 
      WITH (ID NVARCHAR(100) '$.xml_id'
           ,fields NVARCHAR(MAX) AS JSON) A
 OUTER APPLY OPENJSON(a.fields)
             WITH(fieldvalue NVARCHAR(150)
                 ,fieldid BIGINT) B;

结果

ID                          fieldvalue                  fieldid
id_x5d94851726b470.68571510 customerEmail@xyzdomain.com 57282490
id_x5d94851726b470.68571510 123                         57282423
id_x5d94851726b470.68571510 12345-678900                57282500
id_x5d94851726b470.68571510 Test Message here           57282564

简而言之:

您开始正确地使用WITH-子句读取xml_id。属性fields 只不过是同一级别的另一个元素。但我们将其退回AS JSON。这将允许添加另一个APPLY OPENJSON(),传入我们从$.fields 获得的片段并使用另一个WITH 子句来获取数组中对象的两个属性。

【讨论】:

感谢 Shnugo 的正确回答,得到了您的支持以及有用的示例和解释。非常感谢。

以上是关于如何使用 openjson 读取存储在 SQL Server 中的 Json 列下方?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server OPENJSON 读取嵌套的 json

SQL Server 2016 存储过程中的串联 OPENJSON

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

SQL Server 2016 中存储过程中的 OPENJSON 语法

MS SQL OPENJSON JSON

OPENJSON 与 NULL 值交叉应用 (SQL)