转换嵌套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 ...
随机推荐
- Refused to set unsafe header
Refused to set unsafe header Refused to set unsafe header "Host"waitServerDeal @ tGet.html ...
- 【题解】[CF718C Sasha and Array]
[题解]CF718C Sasha and Array 对于我这种喜欢写结构体封装起来的选手这道题真是太对胃了\(hhh\) 一句话题解:直接开一颗线段树的矩阵然后暴力维护还要卡卡常数 我们来把\(2 ...
- 关于wx.redirectTo、wx.navigateTo失效问题
问题:在app.json页面中若配置了tabBar,并且要跳转的目标页面也在tabBar中时,那么常用的几种页面跳转方式便失效了.即不能跳转到tabBar中定义的页面. 解决办法:若要跳转至tabBa ...
- Java for LeetCode 080 Remove Duplicates from Sorted Array II
Follow up for "Remove Duplicates": What if duplicates are allowed at most twice? For examp ...
- 【转】如何让虚拟目录里面的webconfig不继承网站的设置
[转]http://www.cnblogs.com/Sue_/articles/2037556.html 必須在上一层虚拟目录(如根目录)所在的Web.config加上 如:<location ...
- POJ3450 Corporate Identity —— 后缀数组 最长公共子序列
题目链接:https://vjudge.net/problem/POJ-3450 Corporate Identity Time Limit: 3000MS Memory Limit: 65536 ...
- css3立体旋转菜单
css3立体旋转菜单,css3,3D,立体旋转,立体菜单,菜单导航,css3立体旋转菜单是一款纯css3实现的三维立体旋转导航菜单. 源码下载页:http://www.huiyi8.com/sc/71 ...
- Android窗口系统第二篇---Window的添加过程
以前写过客户端Window的创建过程,大概是这样子的.我们一开始从Thread中的handleLaunchActivity方法开始分析,首先加载Activity的字节码文件,利用反射的方式创建一个Ac ...
- rand()与srand()
1.不用srand()的话 两次运行程序产生的随机数序列相同 2.用srand() 两次运行程序产生的随机数则不同 示例程序: #include<iostream> #include< ...
- Linux下安装二进制版mysql-8.0.15
1.添加用户## 添加用户组groupadd mysql## 添加用户,指定用户home目录useradd -g mysql mysql -d /data/mysql## 解压下载的mysql二进制包 ...