码迷,mamicode.com
首页 > Web开发 > 详细

转换嵌套JSON数据为TABLE

时间:2019-05-25 09:34:42      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:节点   type   text   com   节点数据   图片   ide   var   splay   

先准备一些数据:

技术图片

 

创建一张临时表来存储:
技术图片

 

技术图片
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

标签:节点   type   text   com   节点数据   图片   ide   var   splay   

原文地址:https://www.cnblogs.com/insus/p/10921218.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!