转换嵌套JSON数据为TABLE
先准备一些数据:

创建一张临时表来存储:
DECLARE @json_table AS TABLE
(
[type] NVARCHAR(MAX),
[desc] NVARCHAR(MAX)
)
Source Code
获取第一层数据:

INSERT INTO @json_table ([type],[desc])
SELECT [type],[desc] FROM
OPENJSON (@json_text,'$.DB')
WITH (
[type] NVARCHAR(MAX) '$.type',
[desc] NVARCHAR(MAX) '$.desc'
)
WHERE [type] IS NOT NULL;
Source Code
获取第二层DB_CLR节点的数据:

INSERT INTO @json_table ([type],[desc])
SELECT [type],[desc] FROM
OPENJSON (@json_text,'$.DB')
WITH (
DB_CLR NVARCHAR(MAX) AS JSON
)
CROSS APPLY
OPENJSON (DB_CLR)
WITH
(
[type] NVARCHAR(MAX) '$.type',
[desc] NVARCHAR(MAX) '$.desc'
);
Source Code
同样方法,获取第二层的DB_TABLE节点数据:

INSERT INTO @json_table ([type],[desc])
SELECT [type],[desc] FROM
OPENJSON (@json_text,'$.DB')
WITH (
DB_TABLE NVARCHAR(MAX) AS JSON
)
CROSS APPLY
OPENJSON (DB_TABLE)
WITH
(
[type] NVARCHAR(MAX) '$.type',
[desc] NVARCHAR(MAX) '$.desc'
) ;
Source Code
最后查询临时表存储表的数据:

但是,如果我们想加上节点root名称,用来真正区别记录的类别:
把临时表添加一个字段[Root]:

DECLARE @json_table AS TABLE
(
[root] NVARCHAR(MAX),
[type] NVARCHAR(MAX),
[desc] NVARCHAR(MAX)
);
Source Code



以上三个节点获取的源代码:
INSERT INTO @json_table ([root],[type],[desc])
SELECT [key],b.[type],[desc] FROM
OPENJSON (@json_text) a
CROSS APPLY
OPENJSON (@json_text,'$.DB')
WITH (
[type] NVARCHAR(MAX) '$.type',
[desc] NVARCHAR(MAX) '$.desc'
)b
WHERE b.[type] IS NOT NULL; INSERT INTO @json_table ([root],[type],[desc])
SELECT 'DB_CLR', [type],[desc] FROM
OPENJSON (@json_text,'$.DB')
WITH (
DB_CLR NVARCHAR(MAX) AS JSON
)
CROSS APPLY
OPENJSON (DB_CLR)
WITH
(
[type] NVARCHAR(MAX) '$.type',
[desc] NVARCHAR(MAX) '$.desc'
); INSERT INTO @json_table ([root],[type],[desc])
SELECT 'DB_TABLE', [type],[desc] FROM
OPENJSON (@json_text,'$.DB')
WITH (
DB_TABLE NVARCHAR(MAX) AS JSON
)
CROSS APPLY
OPENJSON (DB_TABLE)
WITH
(
[type] NVARCHAR(MAX) '$.type',
[desc] NVARCHAR(MAX) '$.desc'
) ;
Source Code
最后是查询结果:

最后再想修改一下,把3段SQL语句,使用UNION ALL串连起来:

INSERT INTO @json_table ([root],[type],[desc])
SELECT [key],b.[type],[desc] FROM
OPENJSON (@json_text) a
CROSS APPLY
OPENJSON (@json_text,'$.DB')
WITH (
[type] NVARCHAR(MAX) '$.type',
[desc] NVARCHAR(MAX) '$.desc'
)b
WHERE b.[type] IS NOT NULL --INSERT INTO @json_table ([root],[type],[desc])
UNION ALL SELECT 'DB_CLR', [type],[desc] FROM
OPENJSON (@json_text,'$.DB')
WITH (
DB_CLR NVARCHAR(MAX) AS JSON
)
CROSS APPLY
OPENJSON (DB_CLR)
WITH
(
[type] NVARCHAR(MAX) '$.type',
[desc] NVARCHAR(MAX) '$.desc'
) --INSERT INTO @json_table ([root],[type],[desc])
UNION ALL SELECT 'DB_TABLE', [type],[desc] FROM
OPENJSON (@json_text,'$.DB')
WITH (
DB_TABLE NVARCHAR(MAX) AS JSON
)
CROSS APPLY
OPENJSON (DB_TABLE)
WITH
(
[type] NVARCHAR(MAX) '$.type',
[desc] NVARCHAR(MAX) '$.desc'
) ;
Source Code
转换嵌套JSON数据为TABLE的更多相关文章
- ASP.NET提取多层嵌套json数据的方法
本文实例讲述了ASP.NET利用第三方类库Newtonsoft.Json提取多层嵌套json数据的方法,具体例子如下. 假设需要提取的json字符串如下: {"name":&quo ...
- js如何把字符串转换成json数据的方法
js如何把字符串转换成json数据的方法 function strtojson(str){ var json = eval('(' + str + ')'); return json; } 方法二 f ...
- C# DataTable 转换成JSON数据
原文:C# DataTable 转换成JSON数据 using System; using System.Collections.Generic; using System.Data; using S ...
- 将字典或者数组转换成JSON数据或者字符串
将字典或者数组转换成JSON数据或者字符串 源码: NSDictionary+JSON.h 与 NSDictionary+JSON.m // // NSDictionary+JSON.h // Cat ...
- 详解ASP.NET提取多层嵌套json数据的方法
本篇文章主要介绍了ASP.NET提取多层嵌套json数据的方法,利用第三方类库Newtonsoft.Json提取多层嵌套json数据的方法,有兴趣的可以了解一下. 本文实例讲述了ASP.NET利用第三 ...
- java中将数组、对象、Map、List转换成JSON数据
如果要将数组.对象.Map.List转换成JSON数据,那我们需要一些jar包: json-lib-2.4-jdk15.jar ezmorph-1.0.6.jar commons-logging.ja ...
- js 从一个json拼接成另一个json,并做json数据分页table展示
先给数据: //原始json数据json = [{"id":"1","aid":"013","performa ...
- 利用FastJson,拼接复杂嵌套json数据&&直接从json字符串中(不依赖实体类)解析出键值对
1.拼接复杂嵌套json FastJson工具包中有两主要的类: JSONObject和JSONArray ,前者表示json对象,后者表示json数组.他们两者都能添加Object类型的对象,但是J ...
- java中object数据怎么转换成json数据
可以通过这个(json-lib-2.3-jdk15.jar)jar里的方法转换 JSONObject json = JSONObject.fromObject(Object); 如果对象数组 JSON ...
随机推荐
- Linux 日志命令
当日志文件存储日志很大时,我们就不能用vi直接进去查看日志,需要Linux的命令去完成我们的查看任务 Log位置: /var/log/message 系统启动后的信息和错误日志,是Red Hat Li ...
- ABAP 关键字(1)
1.定义DATA ,TYPES TYPES关键字用于创建自定义数据类型,就像JAVA里面创建类一样,用TYPES创建的数据类型可以被其它变量引用(类似于实例化对象),而本身不能直接引用或者赋值. DA ...
- nginx语法之location详解
Location语法优先级排列 匹配符 匹配规则 优先级 = 精确匹配 ^~ 以某个字符串开头 ~ 区分大小写的正则匹配 ~* 不区分大小写的正则匹配 !~ 区分大小写不匹配的正则 !~* 不区分大小 ...
- Android databinding 开发参考
1,android studio添加databinding依赖需要注意事项: http://www.zhihu.com/question/33538477?sort=created 2, databi ...
- 51Nod XOR key —— 区间最大异或值 可持久化字典树
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1295 1295 XOR key 题目来源: HackerRa ...
- 算法(Algorithms)第4版 练习 1.3.27 1.3.28
代码实现: //1.3.27 /** * return the value of the maximum key in the list * * @param list the linked list ...
- Linux-Yum服务器搭建
Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器.基于RPM包管理,能够从指定的服务器自动下载 ...
- Posix线程编程指南(2)
这是一个关于Posix线程编程的专栏.作者在阐明概念的基础上,将向您详细讲述Posix线程库API.本文是第2篇将向您讲述线程的创建与取消. 一.概念及作用在单线程程序中,我们经常要用到"全 ...
- POJ-3680:Intervals (费用流)
You are given N weighted open intervals. The ith interval covers (ai, bi) and weighs wi. Your task i ...
- 洛谷 1979 华容道——最短路+dp
题目:https://www.luogu.org/problemnew/show/P1979 感到无从下手.但不妨用dp的角度来看.因为空格只有在指定棋子的旁边才有用,所以状态记成制定棋子的位置与空格 ...