将嵌套的名称-值对从json导入SQL Server

将嵌套的名称-值对从json导入SQL Server,json,sql-server,sql-server-2016,open-json,Json,Sql Server,Sql Server 2016,Open Json,我正在将一个json文件导入SQL 2016,该文件在嵌套值结构中有一些嵌套的名称-值对。这是我遇到问题的这些对中的值,例如 { "name": "Colour", "value": "Orange" }, { "name": "Calories", "value": "25" } sql: 其结果是: id fruit Colour Weight 1 orange NULL NULL 23 Banana NULL NULL 完整(测试)数据 [ { “id”

我正在将一个json文件导入SQL 2016,该文件在嵌套值结构中有一些嵌套的名称-值对。这是我遇到问题的这些对中的值,例如

{ "name": "Colour", "value": "Orange" }, { "name": "Calories", "value": "25" } 
sql:

其结果是:

id  fruit   Colour  Weight
1   orange  NULL    NULL
23  Banana  NULL    NULL
完整(测试)数据

[ { “id”:1, “水果”:“橙色”, “价值观”:[ {“名称”:“颜色”,“值”:“橙色”}, {“名称”:“重量”,“值”:“16”}, {“名称”:“卡路里”,“值”:“25”} ] }, { “id”:23, “水果”:“香蕉”, “价值观”:[ {“名称”:“颜色”,“值”:“黄色”}, {“名称”:“重量”,“值”:“30”}, {“名称”:“卡路里”,“值”:“250”} ] }
]

您可以尝试下一种方法,该方法将返回完整数据:

DECLARE @json nvarchar(max)
SET @json = N'[ { "id": 1, "fruit": "orange", "values": [ { "name": "Colour", "value": "Orange" }, { "name": "Weight", "value": "16" }, { "name": "Calories", "value": "25" } ] }, { "id": 23, "fruit": "Banana", "values": [ { "name": "Colour", "value": "Yellow" }, { "name": "Weight", "value": "30" }, { "name": "Calories", "value": "250" } ] } ]'

SELECT i.id, i.fruit, v.[name], v.[value]
FROM OPENJSON(@json) 
WITH (
   id int '$.id',
   fruit nvarchar(50) '$.fruit',
   [values] nvarchar(max) '$.values' AS JSON
) AS i
CROSS APPLY (
   SELECT *
   FROM OPENJSON(i.[values])
   WITH (
      [name] nvarchar(max) '$.name',
      [value] nvarchar(max) '$.value'
   )
) v
输出:

id  fruit   name     value
1   orange  Colour   Orange
1   orange  Weight   16
1   orange  Calories 25
23  Banana  Colour   Yellow
23  Banana  Weight   30
23  Banana  Calories 250
id  fruit   Colour  Weight
1   orange  Orange  16
23  Banana  Yellow  30
如果希望输出有关颜色和重量的信息,请尝试以下操作:

DECLARE @json nvarchar(max)
SET @json = N'[ { "id": 1, "fruit": "orange", "values": [ { "name": "Colour", "value": "Orange" }, { "name": "Weight", "value": "16" }, { "name": "Calories", "value": "25" } ] }, { "id": 23, "fruit": "Banana", "values": [ { "name": "Colour", "value": "Yellow" }, { "name": "Weight", "value": "30" }, { "name": "Calories", "value": "250" } ] } ]'

SELECT i.id, i.fruit, v1.[value] AS Colour, v2.[value] AS Weight
FROM OPENJSON(@json) 
WITH (
   id int '$.id',
   fruit nvarchar(50) '$.fruit',
   [values] nvarchar(max) '$.values' AS JSON
) AS i
OUTER APPLY (
   SELECT *
   FROM OPENJSON(i.[values])
   WITH (
      [name] nvarchar(max) '$.name',
      [value] nvarchar(max) '$.value'
   )
   WHERE [name] = 'Colour'
) v1 
OUTER APPLY (
   SELECT *
   FROM OPENJSON(i.[values])
   WITH (
      [name] nvarchar(max) '$.name',
      [value] nvarchar(max) '$.value'
   )
   WHERE [name] = 'Weight'
) v2
输出:

id  fruit   name     value
1   orange  Colour   Orange
1   orange  Weight   16
1   orange  Calories 25
23  Banana  Colour   Yellow
23  Banana  Weight   30
23  Banana  Calories 250
id  fruit   Colour  Weight
1   orange  Orange  16
23  Banana  Yellow  30

您可以尝试下一种方法,该方法将返回完整数据:

DECLARE @json nvarchar(max)
SET @json = N'[ { "id": 1, "fruit": "orange", "values": [ { "name": "Colour", "value": "Orange" }, { "name": "Weight", "value": "16" }, { "name": "Calories", "value": "25" } ] }, { "id": 23, "fruit": "Banana", "values": [ { "name": "Colour", "value": "Yellow" }, { "name": "Weight", "value": "30" }, { "name": "Calories", "value": "250" } ] } ]'

SELECT i.id, i.fruit, v.[name], v.[value]
FROM OPENJSON(@json) 
WITH (
   id int '$.id',
   fruit nvarchar(50) '$.fruit',
   [values] nvarchar(max) '$.values' AS JSON
) AS i
CROSS APPLY (
   SELECT *
   FROM OPENJSON(i.[values])
   WITH (
      [name] nvarchar(max) '$.name',
      [value] nvarchar(max) '$.value'
   )
) v
输出:

id  fruit   name     value
1   orange  Colour   Orange
1   orange  Weight   16
1   orange  Calories 25
23  Banana  Colour   Yellow
23  Banana  Weight   30
23  Banana  Calories 250
id  fruit   Colour  Weight
1   orange  Orange  16
23  Banana  Yellow  30
如果希望输出有关颜色和重量的信息,请尝试以下操作:

DECLARE @json nvarchar(max)
SET @json = N'[ { "id": 1, "fruit": "orange", "values": [ { "name": "Colour", "value": "Orange" }, { "name": "Weight", "value": "16" }, { "name": "Calories", "value": "25" } ] }, { "id": 23, "fruit": "Banana", "values": [ { "name": "Colour", "value": "Yellow" }, { "name": "Weight", "value": "30" }, { "name": "Calories", "value": "250" } ] } ]'

SELECT i.id, i.fruit, v1.[value] AS Colour, v2.[value] AS Weight
FROM OPENJSON(@json) 
WITH (
   id int '$.id',
   fruit nvarchar(50) '$.fruit',
   [values] nvarchar(max) '$.values' AS JSON
) AS i
OUTER APPLY (
   SELECT *
   FROM OPENJSON(i.[values])
   WITH (
      [name] nvarchar(max) '$.name',
      [value] nvarchar(max) '$.value'
   )
   WHERE [name] = 'Colour'
) v1 
OUTER APPLY (
   SELECT *
   FROM OPENJSON(i.[values])
   WITH (
      [name] nvarchar(max) '$.name',
      [value] nvarchar(max) '$.value'
   )
   WHERE [name] = 'Weight'
) v2
输出:

id  fruit   name     value
1   orange  Colour   Orange
1   orange  Weight   16
1   orange  Calories 25
23  Banana  Colour   Yellow
23  Banana  Weight   30
23  Banana  Calories 250
id  fruit   Colour  Weight
1   orange  Orange  16
23  Banana  Yellow  30

非常感谢Zhorov,他正在阅读数据,但不是在我要找的结构中。有趣的方法-我会看看我是否能得到我想要的,直到a能提取出所需的结构。@Fetchezlavache更新了答案。非常感谢。我仍然不相信这是最好的方法,但它是有效的…@Fetchezlavache我已将
交叉应用
更改为
外部应用
——如果你的JSON中没有
颜色
权重
。谢谢,这很有道理,谢谢。仍然在寻找替代方案,因为事实上,数据与水果无关,我有20多个名称/值对..:DMany谢谢Zhorov,这是在读取数据,但不是在我要找的结构中。有趣的方法-我会看看我是否能得到我想要的,直到a能提取出所需的结构。@Fetchezlavache更新了答案。非常感谢。我仍然不相信这是最好的方法,但它是有效的…@Fetchezlavache我已将
交叉应用
更改为
外部应用
——如果你的JSON中没有
颜色
权重
。谢谢,这很有道理,谢谢。仍然在寻找替代方案,因为事实上,数据与水果无关,我有20多个名称/值对..:D