如何加入JSON到table(SQL服务器)
How to join JSON to table (SQL Server)
我正在尝试将 JSON 的数组加入 SQL 服务器中的 table(希望避免使用 TVP)。
Table数据
| item_id | qty |
|-----------|-----|
| dur 20001 | 1 |
| dur 93677 | 1 |
SQL
declare @json nvarchar(max) = '[{
"order":{
"address":{
"addLine": "123 ABC Ln.",
"citySt": "Los Angeles, CA"'
},
"items":[
"line":{
"id":"ABC 12345",
"qty":"1"
}]}, {
"order":{
"address":{
"addLine": "987 Def Ln.",
"citySt": "Los Angeles, CA"
},
"items":[
"line":{
"id":"DEF 12345",
"qty":"1"
}]}
]'
select *
from someTable st
inner join @json
on vt.item_id in (select json_value(@json,'$.items[0].line.id')
from openjson(@json,'$.items[0]'))
但是,我收到以下错误:
Must declare the table variable "@json".
如何使用此表单中的 JSON 加入 someTable
?
如果您遇到错误 'Must declare the table variable "@json"',那么您需要 运行 将整个代码和平分批处理。
在将 json 字符串连接到 table 之前,您需要对其进行解析。
以下是如何操作的示例。我是在我的机器上做的,我正在获取值。
declare @json nvarchar(max)
set @json =
'[{
"order":{
"address":{
"shipToAddLine":null,
"shipToCityStZip":null
},
"items":[
{"line":{
"idItem":"DUR 82674",
"qty":"1"
}}]}}, {
"order":{
"address":{
"shipToAddLine":null,
"shipToCityStZip":null
},
"items":[
{"line":{
"idItem":"DUR 82674",
"qty":"1"
}}]}}
]'
select *
from someTable st join openjson(@json)
with(
itemId varchar(50) '$.order.items[0].line.idItem'
) as js
on st.itemid = js.itemID
您需要考虑这样一个事实,即输入 JSON
的 items
部分是 JSON
个对象的数组,因此有必要使用额外的 CROSS APPLY
解析此 JSON
数组的运算符:
Table 和 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
我正在尝试将 JSON 的数组加入 SQL 服务器中的 table(希望避免使用 TVP)。
Table数据
| item_id | qty |
|-----------|-----|
| dur 20001 | 1 |
| dur 93677 | 1 |
SQL
declare @json nvarchar(max) = '[{
"order":{
"address":{
"addLine": "123 ABC Ln.",
"citySt": "Los Angeles, CA"'
},
"items":[
"line":{
"id":"ABC 12345",
"qty":"1"
}]}, {
"order":{
"address":{
"addLine": "987 Def Ln.",
"citySt": "Los Angeles, CA"
},
"items":[
"line":{
"id":"DEF 12345",
"qty":"1"
}]}
]'
select *
from someTable st
inner join @json
on vt.item_id in (select json_value(@json,'$.items[0].line.id')
from openjson(@json,'$.items[0]'))
但是,我收到以下错误:
Must declare the table variable "@json".
如何使用此表单中的 JSON 加入 someTable
?
如果您遇到错误 'Must declare the table variable "@json"',那么您需要 运行 将整个代码和平分批处理。 在将 json 字符串连接到 table 之前,您需要对其进行解析。 以下是如何操作的示例。我是在我的机器上做的,我正在获取值。
declare @json nvarchar(max)
set @json =
'[{
"order":{
"address":{
"shipToAddLine":null,
"shipToCityStZip":null
},
"items":[
{"line":{
"idItem":"DUR 82674",
"qty":"1"
}}]}}, {
"order":{
"address":{
"shipToAddLine":null,
"shipToCityStZip":null
},
"items":[
{"line":{
"idItem":"DUR 82674",
"qty":"1"
}}]}}
]'
select *
from someTable st join openjson(@json)
with(
itemId varchar(50) '$.order.items[0].line.idItem'
) as js
on st.itemid = js.itemID
您需要考虑这样一个事实,即输入 JSON
的 items
部分是 JSON
个对象的数组,因此有必要使用额外的 CROSS APPLY
解析此 JSON
数组的运算符:
Table 和 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