先准备一些数据:

创建一张临时表来存储:

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的更多相关文章

  1. ASP.NET提取多层嵌套json数据的方法

    本文实例讲述了ASP.NET利用第三方类库Newtonsoft.Json提取多层嵌套json数据的方法,具体例子如下. 假设需要提取的json字符串如下: {"name":&quo ...

  2. js如何把字符串转换成json数据的方法

    js如何把字符串转换成json数据的方法 function strtojson(str){ var json = eval('(' + str + ')'); return json; } 方法二 f ...

  3. C# DataTable 转换成JSON数据

    原文:C# DataTable 转换成JSON数据 using System; using System.Collections.Generic; using System.Data; using S ...

  4. 将字典或者数组转换成JSON数据或者字符串

    将字典或者数组转换成JSON数据或者字符串 源码: NSDictionary+JSON.h 与 NSDictionary+JSON.m // // NSDictionary+JSON.h // Cat ...

  5. 详解ASP.NET提取多层嵌套json数据的方法

    本篇文章主要介绍了ASP.NET提取多层嵌套json数据的方法,利用第三方类库Newtonsoft.Json提取多层嵌套json数据的方法,有兴趣的可以了解一下. 本文实例讲述了ASP.NET利用第三 ...

  6. java中将数组、对象、Map、List转换成JSON数据

    如果要将数组.对象.Map.List转换成JSON数据,那我们需要一些jar包: json-lib-2.4-jdk15.jar ezmorph-1.0.6.jar commons-logging.ja ...

  7. js 从一个json拼接成另一个json,并做json数据分页table展示

    先给数据: //原始json数据json = [{"id":"1","aid":"013","performa ...

  8. 利用FastJson,拼接复杂嵌套json数据&&直接从json字符串中(不依赖实体类)解析出键值对

    1.拼接复杂嵌套json FastJson工具包中有两主要的类: JSONObject和JSONArray ,前者表示json对象,后者表示json数组.他们两者都能添加Object类型的对象,但是J ...

  9. java中object数据怎么转换成json数据

    可以通过这个(json-lib-2.3-jdk15.jar)jar里的方法转换 JSONObject json = JSONObject.fromObject(Object); 如果对象数组 JSON ...

随机推荐

  1. 高德地图API开发二三事(一)如何判断点是否在折线上及引申思考

    最近使用高德地图 JavaScript API 开发地图应用,提炼了不少心得,故写点博文,做个系列总结一下,希望能帮助到LBS开发同胞们. 项目客户端使用高德地图 JavaScript API,主要业 ...

  2. 题解 P3805 【【模板】manacher算法】

    题解 P3805 [[模板]manacher算法] 我们先看两个字符串: ABCCBA ABCDCBA 显然这两字符串是回文的 然而两个串的对称中心的特性不同,第一个串,它的对称中心在两个C中间,然而 ...

  3. 【题解】HNOI2013比赛

    [题解][P3230 HNOI2013]比赛 将得分的序列化成样例给的那种表格,发现一行和一列是同时确定的.这个表格之前是正方形的,后来长宽都减去一,还是正方形.问题形式是递归的.这就启示我们可以把这 ...

  4. HDU 5247 找连续数 (set妙用)

    找连续数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  5. string 转 LPCTSTR

    (1)在ANSI字符集下 LPCTSTR想当于LPCSTR,当中L指long.P指Point,C指Const.在程序中能够直接用char*类型的数据对LPCSTR进行赋值,用下述语句: LPCSTR ...

  6. ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

    mysql 删除表时提示有外键 mysql> drop tables auth_group;ERROR 1217 (23000): Cannot delete or update a paren ...

  7. cron表达式(转)

    原文地址:http://www.cnblogs.com/linjiqin/archive/2013/07/08/3178452.html Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或 ...

  8. API的理解和使用——列表类型的命令

    列表类型的命令及对应的时间复杂度 操作 命令 功能 时间复杂度 添加 rpush key value [value ...] 向右插入 O(k),k是元素个数 lpush key value [val ...

  9. 编写你的第一个django应用程序2

    从1停止的地方开始,我们将设置数据库,创建您的第一个模型,并快速介绍django自动生成的管理站点 数据库设置 现在,打开mysite/settings.py.这是一个普通的python模块,其中模块 ...

  10. idea生成可执行jar

    1.创建工程 ①使用idea新建一个maven工程. ②编辑工具逻辑代码 ③完成代码的编写后添加工具调用的main方法以接收参数 至此代码编辑过程已经基本完成 ④在maven管理依赖的时候使用idea ...