Как я могу прочитать ниже столбец Json, хранящийся в SQL Server, используя openjson? - PullRequest
0 голосов
/ 02 октября 2019
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) ...
 )

и т. Д. Остальные записи? Я получил "NULL" для остальных полей в массиве полей

1 Ответ

0 голосов
/ 03 октября 2019

Вы можете попробовать это так:

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 -класс, чтобы получить два свойства объектов в массиве.

...