使用巢狀的 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