使用嵌套的 JSON 子数组

JSON 可能具有内部数组的复杂结构。在此示例中,我们有订单数组,其中包含 OrderItems 的嵌套子数组。

declare @json nvarchar(4000) = N'[
  {"Number":"SO43659","Date":"2011-05-31T00:00:00",
    "Items":[{"Price":11.99,"Quantity":1},{"Price":12.99,"Quantity":5}]},
  {"Number":"SO43661","Date":"2011-06-01T00:00:00",
    "Items":[{"Price":21.99,"Quantity":3},{"Price":22.99,"Quantity":2},{"Price":23.99,"Quantity":2}]}
]'

我们可以使用 OPENJSON 解析根级别属性,该属性将返回 Items 数组 AS JSON 片段。然后我们可以在 Items 数组上再次应用 OPENJSON 并打开内部 JSON 表。第一级表和内部表将像标准表之间的 JOIN 一样连接

SELECT    * 
FROM
    OPENJSON (@json)
    WITH (  Number varchar(200), Date datetime,
            Items nvarchar(max) AS JSON )
        CROSS APPLY 
            OPENJSON (Items)
            WITH ( Price float, Quantity int)

结果:

日期 项目 价钱 数量
SO43659 2011-05-31 00:00:00.000 [{ 价格:11.99, 数量:1},{ 价格:12.99, 数量:5}] 11.99 1
SO43659 2011-05-31 00:00:00.000 [{ 价格:11.99, 数量:1},{ 价格:12.99, 数量:5}] 12.99
SO43661 2011-06-01 00:00:00.000 [{ 价格:21.99, 数量:3},{ 价格:22.99, 数量:2},{ 价格:23.99, 数量:2}] 21.99 3
SO43661 2011-06-01 00:00:00.000 [{ 价格:21.99, 数量:3},{ 价格:22.99, 数量:2},{ 价格:23.99, 数量:2}] 22.99 2
SO43661 2011-06-01 00:00:00.000 [{ 价格:21.99, 数量:3},{ 价格:22.99, 数量:2},{ 价格:23.99, 数量:2}] 23.99 2