将嵌套的名称-值对从 json 导入到 SQL 服务器
Importing nested name-value pairs from json into SQL Server
我正在将一个 json 文件导入到 SQL 2016,其中在嵌套值结构中有一些嵌套的名称-值对。这是我遇到问题的这些对的值,例如 .
{ "name": "Colour", "value": "Orange" }, { "name": "Calories", "value": "25" }
sql:
Declare @JSON varchar(max)
SELECT @JSON = BulkColumn
FROM OPENROWSET (BULK 'C:\temp\fruit.json', SINGLE_CLOB) as j
If (ISJSON(@JSON)=1) BEGIN
Select * from openjson ( @JSON )
WITH(
id int,
fruit varchar(20),
Colour varchar(20) '$.values.Colour',
Weight int '$.values.Weight'
) as Orders
END
ELSE
Select 'JSON is invalid!'
其结果是:
id fruit Colour Weight
1 orange NULL NULL
23 Banana NULL NULL
完整(测试)数据..
[
{
"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" }
]
}
]
您可以尝试下一种方法,它将 return 完整数据:
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
如果你想输出有关颜色和重量的信息,试试这个:
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 Colour Weight
1 orange Orange 16
23 Banana Yellow 30
我正在将一个 json 文件导入到 SQL 2016,其中在嵌套值结构中有一些嵌套的名称-值对。这是我遇到问题的这些对的值,例如 .
{ "name": "Colour", "value": "Orange" }, { "name": "Calories", "value": "25" }
sql:
Declare @JSON varchar(max)
SELECT @JSON = BulkColumn
FROM OPENROWSET (BULK 'C:\temp\fruit.json', SINGLE_CLOB) as j
If (ISJSON(@JSON)=1) BEGIN
Select * from openjson ( @JSON )
WITH(
id int,
fruit varchar(20),
Colour varchar(20) '$.values.Colour',
Weight int '$.values.Weight'
) as Orders
END
ELSE
Select 'JSON is invalid!'
其结果是:
id fruit Colour Weight
1 orange NULL NULL
23 Banana NULL NULL
完整(测试)数据..
[ { "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" } ] } ]
您可以尝试下一种方法,它将 return 完整数据:
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
如果你想输出有关颜色和重量的信息,试试这个:
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 Colour Weight
1 orange Orange 16
23 Banana Yellow 30