如何从 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()
两次。第一次调用使用默认模式,结果是一个包含key
、value
和type
列的表(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的主要内容,如果未能解决你的问题,请参考以下文章
如何从 C# 动态运行 SQL Server CE [Windows mobile] 中的 SQL 脚本文件?
如何从 SQL Server Express 中的动态查询创建 RDLC 报告