经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MS SQL Server » 查看文章
转换嵌套JSON数据为TABLE
来源:cnblogs  作者:Insus.NET  时间:2019/5/27 8:47:04  对本文有异议

先准备一些数据:

 

创建一张临时表来存储:

 

  1. DECLARE @json_table AS TABLE
  2. (
  3. [type] NVARCHAR(MAX),
  4. [desc] NVARCHAR(MAX)
  5. )
Source Code

 

获取第一层数据:

 

  1. INSERT INTO @json_table ([type],[desc])
  2. SELECT [type],[desc] FROM
  3. OPENJSON (@json_text,'$.DB')
  4. WITH (
  5. [type] NVARCHAR(MAX) '$.type',
  6. [desc] NVARCHAR(MAX) '$.desc'
  7. )
  8. WHERE [type] IS NOT NULL;
Source Code

 

获取第二层DB_CLR节点的数据:

 

  1. INSERT INTO @json_table ([type],[desc])
  2. SELECT [type],[desc] FROM
  3. OPENJSON (@json_text,'$.DB')
  4. WITH (
  5. DB_CLR NVARCHAR(MAX) AS JSON
  6. )
  7. CROSS APPLY
  8. OPENJSON (DB_CLR)
  9. WITH
  10. (
  11. [type] NVARCHAR(MAX) '$.type',
  12. [desc] NVARCHAR(MAX) '$.desc'
  13. );
Source Code

 

同样方法,获取第二层的DB_TABLE节点数据:

 

  1. INSERT INTO @json_table ([type],[desc])
  2. SELECT [type],[desc] FROM
  3. OPENJSON (@json_text,'$.DB')
  4. WITH (
  5. DB_TABLE NVARCHAR(MAX) AS JSON
  6. )
  7. CROSS APPLY
  8. OPENJSON (DB_TABLE)
  9. WITH
  10. (
  11. [type] NVARCHAR(MAX) '$.type',
  12. [desc] NVARCHAR(MAX) '$.desc'
  13. ) ;
Source Code

 

最后查询临时表存储表的数据:

 

但是,如果我们想加上节点root名称,用来真正区别记录的类别:

把临时表添加一个字段[Root]:

 

  1. DECLARE @json_table AS TABLE
  2. (
  3. [root] NVARCHAR(MAX),
  4. [type] NVARCHAR(MAX),
  5. [desc] NVARCHAR(MAX)
  6. );
Source Code

 

 

 

 

以上三个节点获取的源代码:

  1. INSERT INTO @json_table ([root],[type],[desc])
  2. SELECT [key],b.[type],[desc] FROM
  3. OPENJSON (@json_text) a
  4. CROSS APPLY
  5. OPENJSON (@json_text,'$.DB')
  6. WITH (
  7. [type] NVARCHAR(MAX) '$.type',
  8. [desc] NVARCHAR(MAX) '$.desc'
  9. )b
  10. WHERE b.[type] IS NOT NULL;
  11. INSERT INTO @json_table ([root],[type],[desc])
  12. SELECT 'DB_CLR', [type],[desc] FROM
  13. OPENJSON (@json_text,'$.DB')
  14. WITH (
  15. DB_CLR NVARCHAR(MAX) AS JSON
  16. )
  17. CROSS APPLY
  18. OPENJSON (DB_CLR)
  19. WITH
  20. (
  21. [type] NVARCHAR(MAX) '$.type',
  22. [desc] NVARCHAR(MAX) '$.desc'
  23. );
  24. INSERT INTO @json_table ([root],[type],[desc])
  25. SELECT 'DB_TABLE', [type],[desc] FROM
  26. OPENJSON (@json_text,'$.DB')
  27. WITH (
  28. DB_TABLE NVARCHAR(MAX) AS JSON
  29. )
  30. CROSS APPLY
  31. OPENJSON (DB_TABLE)
  32. WITH
  33. (
  34. [type] NVARCHAR(MAX) '$.type',
  35. [desc] NVARCHAR(MAX) '$.desc'
  36. ) ;
Source Code

 

最后是查询结果:

 

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

 

  1. INSERT INTO @json_table ([root],[type],[desc])
  2. SELECT [key],b.[type],[desc] FROM
  3. OPENJSON (@json_text) a
  4. CROSS APPLY
  5. OPENJSON (@json_text,'$.DB')
  6. WITH (
  7. [type] NVARCHAR(MAX) '$.type',
  8. [desc] NVARCHAR(MAX) '$.desc'
  9. )b
  10. WHERE b.[type] IS NOT NULL
  11.  
  12. --INSERT INTO @json_table ([root],[type],[desc])
  13. UNION ALL
  14.  
  15. SELECT 'DB_CLR', [type],[desc] FROM
  16. OPENJSON (@json_text,'$.DB')
  17. WITH (
  18. DB_CLR NVARCHAR(MAX) AS JSON
  19. )
  20. CROSS APPLY
  21. OPENJSON (DB_CLR)
  22. WITH
  23. (
  24. [type] NVARCHAR(MAX) '$.type',
  25. [desc] NVARCHAR(MAX) '$.desc'
  26. )
  27. --INSERT INTO @json_table ([root],[type],[desc])
  28. UNION ALL
  29.  
  30. SELECT 'DB_TABLE', [type],[desc] FROM
  31. OPENJSON (@json_text,'$.DB')
  32. WITH (
  33. DB_TABLE NVARCHAR(MAX) AS JSON
  34. )
  35. CROSS APPLY
  36. OPENJSON (DB_TABLE)
  37. WITH
  38. (
  39. [type] NVARCHAR(MAX) '$.type',
  40. [desc] NVARCHAR(MAX) '$.desc'
  41. ) ;
Source Code

 

原文链接:http://www.cnblogs.com/insus/p/10921218.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号