Необходимо учитывать тот факт, что items
часть ввода JSON
является массивом JSON
объектов, поэтому необходимо использовать дополнительный оператор CROSS APPLY
для разбора этого массива JSON
:
Таблица и JSON:
CREATE TABLE #Data (
idItem varchar(10),
qty int
)
INSERT INTO #Data
(idItem, qty)
VALUES
('DUR 20001', 1),
('DUR 93677', 1),
('DUR 82674', 1)
DECLARE @json nvarchar(max) = N'[{
"order": {
"address":{
"shipToAddLine": null,
"shipToCityStZip": "ZipCode"
},
"items":[
{"line":{
"idItem":"DUR 82674",
"qty":"1"
}},
{"line":{
"idItem":"DUR 82674",
"qty":"1"
}}
]
}}, {
"order":{
"address":{
"shipToAddLine": null,
"shipToCityStZip": "ZipCode"
},
"items":[
{"line":{
"idItem":"DUR 82674",
"qty":"1"
}}
]
}}
]'
Оператор:
SELECT *
FROM #Data d
JOIN (
SELECT
i.shipToAddLine,
i.shipToCityStZip,
j.idItem,
j.qty
FROM OPENJSON(@json) WITH (
shipToAddLine varchar(100) '$.order.address.shipToAddLine',
shipToCityStZip varchar(100) '$.order.address.shipToCityStZip',
items nvarchar(max) '$.order.items' AS JSON
) i
CROSS APPLY OPENJSON(i.items) WITH (
idItem varchar(10) '$.line.idItem',
qty int '$.line.qty'
) j
) json ON d.idItem = json.idItem
Результат:
-------------------------------------------------------------------
idItem qty shipToAddLine shipToCityStZip idItem qty
-------------------------------------------------------------------
DUR 82674 1 ZipCode DUR 82674 1
DUR 82674 1 ZipCode DUR 82674 1
DUR 82674 1 ZipCode DUR 82674 1