转换嵌套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 ...
随机推荐
- 关于Wix的源代码
Wix的源代码有两种方式可以获得,以3.8为例: 在Release的页面下载wix38-debug.zip 通过SourceCode页面下载,http://wix.codeplex.com/Sourc ...
- 在JDK 6和JDK 7的substring()方法的区别?
原文链接:https://www.programcreek.com/2013/09/the-substring-method-in-jdk-6-and-jdk-7/ 在JDK 6和JDK 7中subs ...
- Intellij Idea生成JavaDoc
JavaDoc是一种将注释生成HTML文档的技术,生成的HTML文档类似于Java的API,易读且清晰明了.在简略介绍JavaDoc写法之后,再看一下在Intellij Idea 中如何将代码中的注释 ...
- SpringBoot学习笔记(12):计划任务
SpringBoot学习笔记(12):计划任务 计划任务 在企业的实践生产中,可能需要使用一些定时任务,如月末.季末和年末需要统计各种各样的报表,每周自动备份数据等. 在Spring中使用定时任务 1 ...
- mysql的安装与基本管理
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS ...
- 20145239 杜文超 实验四 Android开发基础
20145239实验四 Android开发基础 实验内容 基于Android Studio开发简单的Android应用并部署测试 了解Android组件.布局管理器的使用 掌握Android中事件处理 ...
- 架构设计:系统间通信(34)——被神化的ESB(上)
1.概述 从本篇文章开始,我们将花一到两篇的篇幅介绍ESB(企业服务总线)技术的基本概念,为读者们理清多个和ESB技术有关名词.我们还将在其中为读者阐述什么情况下应该使用ESB技术.接下来,为了加深读 ...
- Linux bash shell环境变量以及语法规范
摘自: http://blog.csdn.net/abc_ii/article/details/8762739
- 鸟哥的Linux私房菜-第10/11/12/13章(vim程序编辑器、学习bash、正则表达式与文件格式化处理、学习Shell Scripts)
第10章 vim程序编辑器 可以将vim看做vi的进阶版本,vim可以用颜色或底线等方式来显示出一些特殊的信息. 为何要学习vim?因为: a. 所有的 Unix Like 系统都会内建 vi 文书编 ...
- spring属性注入DI
spring setter方式注入: 注入对象属性: 前提: 在bean对应实体中有对应的setter方法. 基础代码: 在bean中有另一个bean属性的setter方法. package cn.i ...