如何加入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

您需要考虑这样一个事实,即输入 JSONitems 部分是 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