【问题标题】:How to load OPENJSON from Dynamic Nodes in SQL Server如何从 SQL Server 中的动态节点加载 OPENJSON
【发布时间】:2019-08-13 14:14:14
【问题描述】:

我通过 REST API 接收到的 JSON 格式包含我无法加载到 OPENJSON 中的动态节点。 JSON 响应来自第三方,我无法更改它。请参阅下面的示例并注意日期被用作节点:

{
    "Meta Data": {
        "1. Information": "API JSON",
        "2. TYPE": "JSON",
    },
    "TSD": {
        "2019-08-13": {
            "value1": "136.0500",
            "value2": "137.7400"
        },
        "2019-08-12": {
            "value1": "137.0700",
            "value2": "137.8600"

        },
        "2019-08-09": {
            "value1": "138.6100",
            "value2": "139.3800"
        }
    }
}

如果我知道使用以下代码的确切日期,我可以获取特定节点:

 SELECT [value1], [value2]
 FROM OPENJSON(@json, '$."TSD"."2019-08-13"')
 WITH (
    [value1] numeric(20,10),
    [value2] numeric(20,10),
    )

但这并没有帮助,因为我不会提前知道日期,并且使用这种方法一次只能选择一个日期节点。

如何在不知道节点名称的情况下引用这些动态日期?

【问题讨论】:

    标签: json sql-server open-json


    【解决方案1】:

    您需要拨打OPENJSON() 两次。第一次调用使用默认模式,结果是一个包含keyvaluetype 列的表(key 列包含日期)。第二个调用是使用具有定义列的显式架构。

    请注意,您需要删除"2. TYPE": "JSON" 之后的额外,

    JSON:

    DECLARE @json nvarchar(max) = N'{
        "Meta Data": {
            "1. Information": "API JSON",
            "2. TYPE": "JSON"
        },
        "TSD": {
            "2019-08-13": {
                "value1": "136.0500",
                "value2": "137.7400"
            },
            "2019-08-12": {
                "value1": "137.0700",
                "value2": "137.8600"
    
            },
            "2019-08-09": {
                "value1": "138.6100",
                "value2": "139.3800"
            }
        }
    }'
    

    声明:

    SELECT 
       j1.[key] AS [Date],
       j2.value1,
       j2.value2
    FROM OPENJSON(@json, '$.TSD') j1
    CROSS APPLY OPENJSON(j1.[value])  WITH (
       value1 numeric(20, 4) '$.value1',
       value2 numeric(20, 4) '$.value2'
    ) j2
    

    输出:

    -------------------------------
    Date        value1      value2
    -------------------------------
    2019-08-13  136.0500    137.7400
    2019-08-12  137.0700    137.8600
    2019-08-09  138.6100    139.380
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-07
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      相关资源
      最近更新 更多