如何从 SQL Server 中的动态节点加载 OPENJSON

Posted

技术标签:

【中文标题】如何从 SQL Server 中的动态节点加载 OPENJSON【英文标题】:How to load OPENJSON from Dynamic Nodes in SQL Server 【发布时间】: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),
    )

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

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于如何从 SQL Server 中的动态节点加载 OPENJSON的主要内容,如果未能解决你的问题,请参考以下文章

插入SQL Server 2017中的边缘表

如何从 C# 动态运行 SQL Server CE [Windows mobile] 中的 SQL 脚本文件?

如何从 SQL Server Express 中的动态查询创建 RDLC 报告

从 SQL Server 中的 XML 中删除所有空节点

从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点)

如何从XML *向SQL Server DATE字段*中插入NULL