将嵌套 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 因为只有一个对象