SQL Server使用OPENJSON将Discovery特殊JSON转为表头对应结构化表
解决方案
可以通过动态SQL拼接的方式实现你要的转换效果,完整可运行的实现代码如下:
DECLARE @JSON nvarchar(max) = N'[ { "headings": [ "vm_type", "Hostname" ], "results": [ [ "AWS EC2 Instance", null ], [ "AWS EC2 Instance", null ] ] } ]' DECLARE @ColNames NVARCHAR(MAX), @SQL NVARCHAR(MAX) -- 提取所有表头字段,拼接成OPENJSON的WITH子句内容 SELECT @ColNames = STRING_AGG(QUOTENAME(value) + ' NVARCHAR(MAX) ''$[' + CAST([key] AS NVARCHAR) + ']''', ',') FROM OPENJSON(@JSON, '$[0].headings') -- 拼接动态查询语句 SET @SQL = N' SELECT ' + @ColNames + N' FROM OPENJSON(@JSON, ''$[0].results'') WITH ( ' + @ColNames + N' )' -- 执行动态SQL EXEC sp_executesql @SQL, N'@JSON NVARCHAR(MAX)', @JSON = @JSON
实现逻辑说明
- 首先通过
OPENJSON遍历headings节点,拿到每个表头字段对应的数组下标,拼接出查询字段与results二维数组下标之间的映射规则 - 把映射规则拼接到动态查询语句中,执行后即可直接输出
headings为列名、results值按顺序匹配的结构化表
注意事项
- 若使用SQL Server 2016版本(不支持
STRING_AGG函数),可以将列名拼接部分替换为FOR XML PATH的实现方式 - 你可以根据实际业务中字段的类型,修改拼接时的字段类型声明,不需要全用
NVARCHAR(MAX) - 如果外层JSON数组包含多组
headings+results的组合,可在外层增加遍历逻辑逐组处理
内容的提问来源于stack exchange,提问作者JY.
相关产品推荐
相关产品推荐

