将嵌套 JSON 解析为 Azure SQL table
Parse Nested JSON to Azure SQL table
我编写了一个函数,它从 API 请求一些数据并将其转储到存储帐户中。然后我使用 this 方法访问 Azure SQL 数据库中的数据。一切都按预期工作,但我只剩下下面的样子 table:
+-----+-----------------------------------------------------------------------------------------------------------------------------+--------+
| key | value | type |
+-----+-----------------------------------------------------------------------------------------------------------------------------+--------+
| 0 | {"Localnumber": "1200", "Name": "Hovednummer - IT", "Description": null, "Email": "", "PhoneNumbers": [], "Phones": ...} | 5 |
+-----+-----------------------------------------------------------------------------------------------------------------------------+--------+
JSON 值如下所示:
[
{
"Localnumber": "626",
"Name": "name",
"Description": null,
"Email": "email",
"PhoneNumbers": [
{
"Number": "88888888",
"LineName": null,
"BelongsTo": "626",
"GotoLocalNumber": null
},
{
"Number": "12345678",
"LineName": null,
"BelongsTo": "626",
"GotoLocalNumber": null
}
],
"Phones": [
{
"LocalNumber": "200018",
"Name": null,
"Type": 21,
"MAC": null,
"BelongsTo": "626",
"description": "Myfone"
},
{
"LocalNumber": "200273",
"Name": null,
"Type": 8,
"MAC": "40859694",
"BelongsTo": "626",
"description": "mobile"
},
{
"LocalNumber": "200449",
"Name": null,
"Type": 23,
"MAC": null,
"BelongsTo": "626",
"description": "test"
}
],
"Info": [
{
"Type": 0,
"Label": null,
"Value": null
}
],
"Department": {
"Name": "name",
"Street": "Street",
"Zipcode": "1111",
"City": "City",
"Cvr": "123456798",
"Contact": "Contact",
"Email": "email",
"Ean": null,
"Iref": null
}
}
]
如何将其插入到新的 table 中,以便每个 JSON 值看起来像这样:
+-------------+---------+-------------+-------+---------------------+-----------------------+------------------------+------------------------------+--------------------+-------------+-------------+------------+------------------+--------------------+-----------+------------+------------+-----------------+-------------------+--------------------+-----------------+----------------+--------------------+-------------------+----------------+-----------------+
| Localnumber | Name | Description | Email | PhoneNumbers_Number | PhoneNumbers_LineName | PhoneNumbers_BelongsTo | PhoneNumbers_GotoLocalNumber | Phones_LocalNumber | Phones_Name | Phones_Type | Phones_MAC | Phones_BelongsTo | Phones_description | Info_Type | Info_Label | Info_Value | Department_Name | Department_Street | Department_Zipcode | Department_City | Department_Cvr | Department_Contact | Department_Email | Department_Ean | Department_Iref |
+-------------+---------+-------------+-------+---------------------+-----------------------+------------------------+------------------------------+--------------------+-------------+-------------+------------+------------------+--------------------+-----------+------------+------------+-----------------+-------------------+--------------------+-----------------+----------------+--------------------+-------------------+----------------+-----------------+
| 1213 | Z3C (1) | NULL | NULL | 20813221 | NULL | 1213 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| 1213 | Z3C (1) | NULL | NULL | NULL | NULL | NULL | NULL | 200013 | NULL | 21 | NULL | 1213 | Myfone | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| 1213 | Z3C (1) | NULL | NULL | NULL | NULL | NULL | NULL | 200270 | NULL | 8 | 20813221 | 1213 | Mobil (20813221) | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| 1213 | Z3C (1) | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| 1213 | Z3C (1) | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Obton A/S | Silkeborgvej 2 | 8000 | Aarhus | 31596106 | Søren Thygesen | faktura@obton.com | NULL | NULL |
+-------------+---------+-------------+-------+---------------------+-----------------------+------------------------+------------------------------+--------------------+-------------+-------------+------------+------------------+--------------------+-----------+------------+------------+-----------------+-------------------+--------------------+-----------------+----------------+--------------------+-------------------+----------------+-----------------+
编辑
所以下面的查询帮助我实现了我正在搜索的内容。
SELECT GO.LocalNumber
,GO.Name
,GO.Description
,GO.Email
,json.Number
,json.LineName
,json.Belongsto
,json.GoToLocalNumber
,go2.LocalNumber
,go2.Name
,go2.Type
,go2.MAC
,go2.BelongsTo
,go2.description 'description_phones'
,go3.Type 'Info_Type'
,go3.Label
,go3.Value
,go4.Name
,go4.Street
,go4.Zipcode
,go4.City
,go4.Cvr
,go4.Contact
,go4.Email
,go4.Ean
,go4.Iref
FROM openrowset(BULK 'flexfoneoutputblob/data', DATA_SOURCE = 'FlexfoneBlobStorage', SINGLE_CLOB) AS AzureBlob
CROSS APPLY OPENJSON(BulkColumn) WITH (
Localnumber INT
,Name NVARCHAR(250)
,Description NVARCHAR(250)
,Email NVARCHAR(250)
,PhoneNumbers NVARCHAR(MAX) AS json
,Phones NVARCHAR(MAX) AS json
,Info NVARCHAR(MAX) AS json
,Department NVARCHAR(MAX) AS json
) AS GO
CROSS APPLY OPENJSON(PhoneNumbers) WITH (
Number NVARCHAR(20)
,LineName NVARCHAR(20)
,BelongsTo NVARCHAR(10)
,GotoLocalNumber NVARCHAR(20)
) AS json
CROSS APPLY OPENJSON(Phones) WITH (
LocalNumber NVARCHAR(20)
,Name NVARCHAR(50)
,Type INT
,MAC NVARCHAR(20)
,BelongsTo NVARCHAR(20)
,description NVARCHAR(30)
) AS go2
CROSS APPLY OPENJSON(Info) WITH (
Type INT
,Label NVARCHAR(20)
,Value NVARCHAR(20)
) AS go3
CROSS APPLY OPENJSON(Department) WITH (
Name NVARCHAR(20)
,Street NVARCHAR(20)
,Zipcode NVARCHAR(20)
,City NVARCHAR(20)
,Cvr NVARCHAR(20)
,Contact NVARCHAR(20)
,Email NVARCHAR(20)
,Ean NVARCHAR(20)
,Iref NVARCHAR(20)
) AS go4
如果您想将其放入单独的表中,您可以使用 SCOPE_IDENTITY
获取前一个插入的 ID。
因为根对象在数组中,所以需要把路径改成$[0]
DECLARE @json nvarchar(max) = (
SELECT BulkColumn
FROM openrowset(BULK 'flexfoneoutputblob/data', DATA_SOURCE = 'FlexfoneBlobStorage', SINGLE_CLOB)
);
SELECT LocalNumber
,Name
,Description
,Email
FROM OPENJSON(@json, '$[0]') WITH (
Localnumber INT
,Name NVARCHAR(250)
,Description NVARCHAR(250)
,Email NVARCHAR(250)
) AS G;
DECLARE @id int = SCOPE_IDENTITY();
INSERT PhoneNumber
(GId, Number, LineName, BelongsTo, GotoLocalNumber)
SELECT @id, Number, LineName, BelongsTo, GotoLocalNumber
FROM OPENJSON(@json, '$[0].PhoneNumbers') WITH (
Number NVARCHAR(20)
,LineName NVARCHAR(20)
,BelongsTo NVARCHAR(10)
,GotoLocalNumber NVARCHAR(20)
) AS json;
INSERT Phone
(GId, LocalNumber, Name, Type, MAC, BelongsTo, description)
SELECT @id, LocalNumber, Name, Type, MAC, BelongsTo, description
FROM OPENJSON(@json, '$[0].Phones') WITH (
LocalNumber NVARCHAR(20)
,Name NVARCHAR(50)
,Type INT
,MAC NVARCHAR(20)
,BelongsTo NVARCHAR(20)
,description NVARCHAR(30)
) AS go2;
INSERT Info
(GId, Type, Label, Value)
SELECT @id, Type, Label, Value
FROM OPENJSON(@json, '$[0].Info') WITH (
Type INT
,Label NVARCHAR(20)
,Value NVARCHAR(20)
) AS go3
INSERT Department
(GId, Name, Street, Zipcode, City, Cvr, Contact, Email, Ean, Iref)
SELECT @id, Name, Street, Zipcode, City, Cvr, Contact, Email, Ean, Iref
FROM OPENJSON(@json, '$[0].Department') WITH (
Name NVARCHAR(20)
,Street NVARCHAR(20)
,Zipcode NVARCHAR(20)
,City NVARCHAR(20)
,Cvr NVARCHAR(20)
,Contact NVARCHAR(20)
,Email NVARCHAR(20)
,Ean NVARCHAR(20)
,Iref NVARCHAR(20)
) AS go4
对于根对象和 Department
你也可以使用 JSON_VALUE
因为只有一个对象
我编写了一个函数,它从 API 请求一些数据并将其转储到存储帐户中。然后我使用 this 方法访问 Azure SQL 数据库中的数据。一切都按预期工作,但我只剩下下面的样子 table:
+-----+-----------------------------------------------------------------------------------------------------------------------------+--------+
| key | value | type |
+-----+-----------------------------------------------------------------------------------------------------------------------------+--------+
| 0 | {"Localnumber": "1200", "Name": "Hovednummer - IT", "Description": null, "Email": "", "PhoneNumbers": [], "Phones": ...} | 5 |
+-----+-----------------------------------------------------------------------------------------------------------------------------+--------+
JSON 值如下所示:
[
{
"Localnumber": "626",
"Name": "name",
"Description": null,
"Email": "email",
"PhoneNumbers": [
{
"Number": "88888888",
"LineName": null,
"BelongsTo": "626",
"GotoLocalNumber": null
},
{
"Number": "12345678",
"LineName": null,
"BelongsTo": "626",
"GotoLocalNumber": null
}
],
"Phones": [
{
"LocalNumber": "200018",
"Name": null,
"Type": 21,
"MAC": null,
"BelongsTo": "626",
"description": "Myfone"
},
{
"LocalNumber": "200273",
"Name": null,
"Type": 8,
"MAC": "40859694",
"BelongsTo": "626",
"description": "mobile"
},
{
"LocalNumber": "200449",
"Name": null,
"Type": 23,
"MAC": null,
"BelongsTo": "626",
"description": "test"
}
],
"Info": [
{
"Type": 0,
"Label": null,
"Value": null
}
],
"Department": {
"Name": "name",
"Street": "Street",
"Zipcode": "1111",
"City": "City",
"Cvr": "123456798",
"Contact": "Contact",
"Email": "email",
"Ean": null,
"Iref": null
}
}
]
如何将其插入到新的 table 中,以便每个 JSON 值看起来像这样:
+-------------+---------+-------------+-------+---------------------+-----------------------+------------------------+------------------------------+--------------------+-------------+-------------+------------+------------------+--------------------+-----------+------------+------------+-----------------+-------------------+--------------------+-----------------+----------------+--------------------+-------------------+----------------+-----------------+
| Localnumber | Name | Description | Email | PhoneNumbers_Number | PhoneNumbers_LineName | PhoneNumbers_BelongsTo | PhoneNumbers_GotoLocalNumber | Phones_LocalNumber | Phones_Name | Phones_Type | Phones_MAC | Phones_BelongsTo | Phones_description | Info_Type | Info_Label | Info_Value | Department_Name | Department_Street | Department_Zipcode | Department_City | Department_Cvr | Department_Contact | Department_Email | Department_Ean | Department_Iref |
+-------------+---------+-------------+-------+---------------------+-----------------------+------------------------+------------------------------+--------------------+-------------+-------------+------------+------------------+--------------------+-----------+------------+------------+-----------------+-------------------+--------------------+-----------------+----------------+--------------------+-------------------+----------------+-----------------+
| 1213 | Z3C (1) | NULL | NULL | 20813221 | NULL | 1213 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| 1213 | Z3C (1) | NULL | NULL | NULL | NULL | NULL | NULL | 200013 | NULL | 21 | NULL | 1213 | Myfone | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| 1213 | Z3C (1) | NULL | NULL | NULL | NULL | NULL | NULL | 200270 | NULL | 8 | 20813221 | 1213 | Mobil (20813221) | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| 1213 | Z3C (1) | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| 1213 | Z3C (1) | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Obton A/S | Silkeborgvej 2 | 8000 | Aarhus | 31596106 | Søren Thygesen | faktura@obton.com | NULL | NULL |
+-------------+---------+-------------+-------+---------------------+-----------------------+------------------------+------------------------------+--------------------+-------------+-------------+------------+------------------+--------------------+-----------+------------+------------+-----------------+-------------------+--------------------+-----------------+----------------+--------------------+-------------------+----------------+-----------------+
编辑
所以下面的查询帮助我实现了我正在搜索的内容。
SELECT GO.LocalNumber
,GO.Name
,GO.Description
,GO.Email
,json.Number
,json.LineName
,json.Belongsto
,json.GoToLocalNumber
,go2.LocalNumber
,go2.Name
,go2.Type
,go2.MAC
,go2.BelongsTo
,go2.description 'description_phones'
,go3.Type 'Info_Type'
,go3.Label
,go3.Value
,go4.Name
,go4.Street
,go4.Zipcode
,go4.City
,go4.Cvr
,go4.Contact
,go4.Email
,go4.Ean
,go4.Iref
FROM openrowset(BULK 'flexfoneoutputblob/data', DATA_SOURCE = 'FlexfoneBlobStorage', SINGLE_CLOB) AS AzureBlob
CROSS APPLY OPENJSON(BulkColumn) WITH (
Localnumber INT
,Name NVARCHAR(250)
,Description NVARCHAR(250)
,Email NVARCHAR(250)
,PhoneNumbers NVARCHAR(MAX) AS json
,Phones NVARCHAR(MAX) AS json
,Info NVARCHAR(MAX) AS json
,Department NVARCHAR(MAX) AS json
) AS GO
CROSS APPLY OPENJSON(PhoneNumbers) WITH (
Number NVARCHAR(20)
,LineName NVARCHAR(20)
,BelongsTo NVARCHAR(10)
,GotoLocalNumber NVARCHAR(20)
) AS json
CROSS APPLY OPENJSON(Phones) WITH (
LocalNumber NVARCHAR(20)
,Name NVARCHAR(50)
,Type INT
,MAC NVARCHAR(20)
,BelongsTo NVARCHAR(20)
,description NVARCHAR(30)
) AS go2
CROSS APPLY OPENJSON(Info) WITH (
Type INT
,Label NVARCHAR(20)
,Value NVARCHAR(20)
) AS go3
CROSS APPLY OPENJSON(Department) WITH (
Name NVARCHAR(20)
,Street NVARCHAR(20)
,Zipcode NVARCHAR(20)
,City NVARCHAR(20)
,Cvr NVARCHAR(20)
,Contact NVARCHAR(20)
,Email NVARCHAR(20)
,Ean NVARCHAR(20)
,Iref NVARCHAR(20)
) AS go4
如果您想将其放入单独的表中,您可以使用 SCOPE_IDENTITY
获取前一个插入的 ID。
因为根对象在数组中,所以需要把路径改成$[0]
DECLARE @json nvarchar(max) = (
SELECT BulkColumn
FROM openrowset(BULK 'flexfoneoutputblob/data', DATA_SOURCE = 'FlexfoneBlobStorage', SINGLE_CLOB)
);
SELECT LocalNumber
,Name
,Description
,Email
FROM OPENJSON(@json, '$[0]') WITH (
Localnumber INT
,Name NVARCHAR(250)
,Description NVARCHAR(250)
,Email NVARCHAR(250)
) AS G;
DECLARE @id int = SCOPE_IDENTITY();
INSERT PhoneNumber
(GId, Number, LineName, BelongsTo, GotoLocalNumber)
SELECT @id, Number, LineName, BelongsTo, GotoLocalNumber
FROM OPENJSON(@json, '$[0].PhoneNumbers') WITH (
Number NVARCHAR(20)
,LineName NVARCHAR(20)
,BelongsTo NVARCHAR(10)
,GotoLocalNumber NVARCHAR(20)
) AS json;
INSERT Phone
(GId, LocalNumber, Name, Type, MAC, BelongsTo, description)
SELECT @id, LocalNumber, Name, Type, MAC, BelongsTo, description
FROM OPENJSON(@json, '$[0].Phones') WITH (
LocalNumber NVARCHAR(20)
,Name NVARCHAR(50)
,Type INT
,MAC NVARCHAR(20)
,BelongsTo NVARCHAR(20)
,description NVARCHAR(30)
) AS go2;
INSERT Info
(GId, Type, Label, Value)
SELECT @id, Type, Label, Value
FROM OPENJSON(@json, '$[0].Info') WITH (
Type INT
,Label NVARCHAR(20)
,Value NVARCHAR(20)
) AS go3
INSERT Department
(GId, Name, Street, Zipcode, City, Cvr, Contact, Email, Ean, Iref)
SELECT @id, Name, Street, Zipcode, City, Cvr, Contact, Email, Ean, Iref
FROM OPENJSON(@json, '$[0].Department') WITH (
Name NVARCHAR(20)
,Street NVARCHAR(20)
,Zipcode NVARCHAR(20)
,City NVARCHAR(20)
,Cvr NVARCHAR(20)
,Contact NVARCHAR(20)
,Email NVARCHAR(20)
,Ean NVARCHAR(20)
,Iref NVARCHAR(20)
) AS go4
对于根对象和 Department
你也可以使用 JSON_VALUE
因为只有一个对象