实现SQL Server 原生数据从XML生成JSON数据的实例代码

作者:feng1456 时间:2024-01-16 01:46:03 

实现SQL Server 原生数据从XML生成JSON数据的实例代码

   SQL Server 是关系数据库,查询结果通常都是数据集,但是在一些特殊需求下,我们需要XML数据,最近这些年,JSON作为WebAPI常用的交换数据格式,那么数据库如何生成JSON数据呢?今天就写了一个DEMO.

       1.创建表及测试数据


SET NOCOUNT ON

IF OBJECT_ID('STATS') IS NOT NULL DROP TABLE STATS
IF OBJECT_ID('STATIONS') IS NOT NULL DROP TABLE STATIONS
IF OBJECT_ID('OPERATORS') IS NOT NULL DROP TABLE OPERATORS
IF OBJECT_ID('REVIEWS') IS NOT NULL DROP TABLE REVIEWS

-- Create and populate table with Station
CREATE TABLE STATIONS(ID INTEGER PRIMARY KEY, CITY NVARCHAR(20), STATE CHAR(2), LAT_N REAL, LONG_W REAL);
INSERT INTO STATIONS VALUES (13, 'Phoenix', 'AZ', 33, 112);
INSERT INTO STATIONS VALUES (44, 'Denver', 'CO', 40, 105);
INSERT INTO STATIONS VALUES (66, 'Caribou', 'ME', 47, 68);

-- Create and populate table with Operators
CREATE TABLE OPERATORS(ID INTEGER PRIMARY KEY, NAME NVARCHAR(20), SURNAME NVARCHAR(20));
INSERT INTO OPERATORS VALUES (50, 'John "The Fox"', 'Brown');
INSERT INTO OPERATORS VALUES (51, 'Paul', 'Smith');
INSERT INTO OPERATORS VALUES (52, 'Michael', 'Williams');  

-- Create and populate table with normalized temperature and precipitation data
CREATE TABLE STATS (
   STATION_ID INTEGER REFERENCES STATIONS(ID),
   MONTH INTEGER CHECK (MONTH BETWEEN 1 AND 12),
   TEMP_F REAL CHECK (TEMP_F BETWEEN -80 AND 150),
   RAIN_I REAL CHECK (RAIN_I BETWEEN 0 AND 100), PRIMARY KEY (STATION_ID, MONTH));
INSERT INTO STATS VALUES (13, 1, 57.4, 0.31);
INSERT INTO STATS VALUES (13, 7, 91.7, 5.15);
INSERT INTO STATS VALUES (44, 1, 27.3, 0.18);
INSERT INTO STATS VALUES (44, 7, 74.8, 2.11);
INSERT INTO STATS VALUES (66, 1, 6.7, 2.10);
INSERT INTO STATS VALUES (66, 7, 65.8, 4.52);

-- Create and populate table with Review
CREATE TABLE REVIEWS(STATION_ID INTEGER,STAT_MONTH INTEGER,OPERATOR_ID INTEGER)  
insert into REVIEWS VALUES (13,1,50)
insert into REVIEWS VALUES (13,7,50)
insert into REVIEWS VALUES (44,7,51)
insert into REVIEWS VALUES (44,7,52)
insert into REVIEWS VALUES (44,7,50)
insert into REVIEWS VALUES (66,1,51)
insert into REVIEWS VALUES (66,7,51)

2.查询结果集


select   STATIONS.ID    as ID,
     STATIONS.CITY   as City,
     STATIONS.STATE  as State,
     STATIONS.LAT_N  as LatN,
     STATIONS.LONG_W  as LongW,
     STATS.MONTH    as Month,
     STATS.RAIN_I   as Rain,
     STATS.TEMP_F   as Temp,
   OPERATORS.NAME  as Name,
   OPERATORS.SURNAME as Surname
from    stations  
inner join stats   on stats.STATION_ID=STATIONS.ID  
left join reviews  on reviews.STATION_ID=stations.id  
          and reviews.STAT_MONTH=STATS.[MONTH]
left join OPERATORS on OPERATORS.ID=reviews.OPERATOR_ID

结果:

实现SQL Server 原生数据从XML生成JSON数据的实例代码

2.查询xml数据


select stations.*,
   (select stats.*,  
       (select OPERATORS.*  
       from  OPERATORS  
       inner join reviews on OPERATORS.ID=reviews.OPERATOR_ID  
       where reviews.STATION_ID=STATS.STATION_ID  
       and  reviews.STAT_MONTH=STATS.MONTH  
       for xml path('operator'),type
       ) operators
   from STATS  
   where STATS.STATION_ID=stations.ID  
   for xml path('stat'),type
   ) stats  
from  stations  
for  xml path('station'),type

结果:


<station>
<ID>13</ID>
<CITY>Phoenix</CITY>
<STATE>AZ</STATE>
<LAT_N>3.3000000e+001</LAT_N>
<LONG_W>1.1200000e+002</LONG_W>
<stats>
 <stat>
  <STATION_ID>13</STATION_ID>
  <MONTH>1</MONTH>
  <TEMP_F>5.7400002e+001</TEMP_F>
  <RAIN_I>3.1000000e-001</RAIN_I>
  <operators>
   <operator>
    <ID>50</ID>
    <NAME>John "The Fox"</NAME>
    <SURNAME>Brown</SURNAME>
   </operator>
  </operators>
 </stat>
 <stat>
  <STATION_ID>13</STATION_ID>
  <MONTH>7</MONTH>
  <TEMP_F>9.1699997e+001</TEMP_F>
  <RAIN_I>5.1500001e+000</RAIN_I>
  <operators>
   <operator>
    <ID>50</ID>
    <NAME>John "The Fox"</NAME>
    <SURNAME>Brown</SURNAME>
   </operator>
  </operators>
 </stat>
</stats>
</station>
<station>
<ID>44</ID>
<CITY>Denver</CITY>
<STATE>CO</STATE>
<LAT_N>4.0000000e+001</LAT_N>
<LONG_W>1.0500000e+002</LONG_W>
<stats>
 <stat>
  <STATION_ID>44</STATION_ID>
  <MONTH>1</MONTH>
  <TEMP_F>2.7299999e+001</TEMP_F>
  <RAIN_I>1.8000001e-001</RAIN_I>
 </stat>
 <stat>
  <STATION_ID>44</STATION_ID>
  <MONTH>7</MONTH>
  <TEMP_F>7.4800003e+001</TEMP_F>
  <RAIN_I>2.1099999e+000</RAIN_I>
  <operators>
   <operator>
    <ID>51</ID>
    <NAME>Paul</NAME>
    <SURNAME>Smith</SURNAME>
   </operator>
   <operator>
    <ID>52</ID>
    <NAME>Michael</NAME>
    <SURNAME>Williams</SURNAME>
   </operator>
   <operator>
    <ID>50</ID>
    <NAME>John "The Fox"</NAME>
    <SURNAME>Brown</SURNAME>
   </operator>
  </operators>
 </stat>
</stats>
</station>
<station>
<ID>66</ID>
<CITY>Caribou</CITY>
<STATE>ME</STATE>
<LAT_N>4.7000000e+001</LAT_N>
<LONG_W>6.8000000e+001</LONG_W>
<stats>
 <stat>
  <STATION_ID>66</STATION_ID>
  <MONTH>1</MONTH>
  <TEMP_F>6.6999998e+000</TEMP_F>
  <RAIN_I>2.0999999e+000</RAIN_I>
  <operators>
   <operator>
    <ID>51</ID>
    <NAME>Paul</NAME>
    <SURNAME>Smith</SURNAME>
   </operator>
  </operators>
 </stat>
 <stat>
  <STATION_ID>66</STATION_ID>
  <MONTH>7</MONTH>
  <TEMP_F>6.5800003e+001</TEMP_F>
  <RAIN_I>4.5200000e+000</RAIN_I>
  <operators>
   <operator>
    <ID>51</ID>
    <NAME>Paul</NAME>
    <SURNAME>Smith</SURNAME>
   </operator>
  </operators>
 </stat>
</stats>
</station>

3.如何生成JSON数据

1)创建辅助函数


CREATE FUNCTION [dbo].[qfn_XmlToJson](@XmlData xml)
RETURNS nvarchar(max)
AS
BEGIN
declare @m nvarchar(max)
SELECT @m='['+Stuff
(
  (SELECT theline from
 (SELECT ','+' {'+Stuff
   (
      (SELECT ',"'+coalesce(b.c.value('local-name(.)', 'NVARCHAR(255)'),'')+'":'+
          case when b.c.value('count(*)','int')=0  
          then dbo.[qfn_JsonEscape](b.c.value('text()[1]','NVARCHAR(MAX)'))
          else dbo.qfn_XmlToJson(b.c.query('*'))
          end
        from x.a.nodes('*') b(c)                                
        for xml path(''),TYPE).value('(./text())[1]','NVARCHAR(MAX)')
       ,1,1,'')+'}'
    from @XmlData.nodes('/*') x(a)
   ) JSON(theLine)
   for xml path(''),TYPE).value('.','NVARCHAR(MAX)')
  ,1,1,'')+']'
 return @m
END

CREATE FUNCTION [dbo].[qfn_JsonEscape](@value nvarchar(max) )
returns nvarchar(max)
as begin

if (@value is null) return 'null'
if (TRY_PARSE( @value as float) is not null) return @value

set @value=replace(@value,'\','\\')
set @value=replace(@value,'"','\"')

return '"'+@value+'"'
end

3)查询sql


select dbo.qfn_XmlToJson
(
(
 select stations.ID,stations.CITY,stations.STATE,stations.LAT_N,stations.LONG_W ,
    (select stats.*,  
         (select OPERATORS.*  
         from  OPERATORS inner join reviews  
         on   OPERATORS.ID=reviews.OPERATOR_ID
         where reviews.STATION_ID=STATS.STATION_ID  
         and  reviews.STAT_MONTH=STATS.MONTH  
         for xml path('operator'),type
         ) operators
     from STATS  
     where STATS.STATION_ID=stations.ID for xml path('stat'),type
    ) stats  
  from stations for xml path('stations'),type
 )
)

结果:


[ {"ID":13,"CITY":"Phoenix","STATE":"AZ","LAT_N":3.3000000e+001,"LONG_W"
:1.1200000e+002,"stats":[ {"STATION_ID":13,"MONTH":1,"TEMP_F":5.7400002e+001,"
RAIN_I":3.1000000e-001,"operators":[ {"ID":50,"NAME":"John \"The Fox\"","SURNAME":"Brown"}]},
{"STATION_ID":13,"MONTH":7,"TEMP_F":9.1699997e+001,"RAIN_I":5.1500001e+000,"operators":
[ {"ID":50,"NAME":"John \"The Fox\"","SURNAME":"Brown"}]}]}, {"ID":44,"CITY":"Denver",
"STATE":"CO","LAT_N":4.0000000e+001,"LONG_W":1.0500000e+002,"stats":[ {"STATION_ID":44,
"MONTH":1,"TEMP_F":2.7299999e+001,"RAIN_I":1.8000001e-001}, {"STATION_ID":44,"MONTH":7,
"TEMP_F":7.4800003e+001,"RAIN_I":2.1099999e+000,"operators":[ {"ID":51,"NAME":"Paul",
"SURNAME":"Smith"}, {"ID":52,"NAME":"Michael","SURNAME":"Williams"}, {"ID":50,"NAME"
:"John \"The Fox\"","SURNAME":"Brown"}]}]}, {"ID":66,"CITY":"Caribou","STATE":"ME","LAT_N":
4.7000000e+001,"LONG_W":6.8000000e+001,"stats":[ {"STATION_ID":66,"MONTH":1,"TEMP
_F":6.6999998e+000,"RAIN_I":2.0999999e+000,"operators":[ {"ID":51,"NAME":"Paul","
SURNAME":"Smith"}]}, {"STATION_ID":66,"MONTH":7,"TEMP_F":6.5800003e+001,"RAIN_I":
4.5200000e+000,"operators":[ {"ID":51,"NAME":"Paul","SURNAME":"Smith"}]}]}]

总结:

JSON作为灵活的Web通信交换架构,如果把配置数据存放在数据库中,直接获取JSON,那配置就会非常简单了,也能够大量减轻应用服务器的压力!

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

来源:http://blog.csdn.net/afandaafandaafanda/article/details/45936475

标签:SQLServer,XML,JSON数据
0
投稿

猜你喜欢

  • asp中如何对ip段进行过滤限制

    2007-09-17 11:14:00
  • Python matplotlib绘图建立画布及坐标系

    2021-03-28 02:56:07
  • 详细解读php的命名空间(一)

    2023-06-19 08:02:59
  • PHP基于phpqrcode生成带LOGO图像的二维码实例

    2023-11-23 23:47:18
  • OpenCV模板匹配matchTemplate的实现

    2021-08-09 15:51:51
  • 分享4个最受欢迎的大数据可视化工具

    2022-12-23 02:45:18
  • SQLServer导出数据到MySQL实例介绍

    2024-01-13 08:07:17
  • Python readline()和readlines()函数实现按行读取文件

    2022-02-21 13:19:36
  • Pycharm配置远程SSH服务器实现(切换不同虚拟环境)

    2023-09-06 10:11:09
  • 基于PyQT5制作一个课堂点名系统

    2023-10-08 20:52:13
  • 用python写一个定时提醒程序的实现代码

    2021-04-12 12:25:45
  • 如何基于pythonnet调用halcon脚本

    2022-09-27 16:34:23
  • 亚马逊购物用户体验分析 (一)

    2009-10-25 12:40:00
  • 使用vue.js写一个tab选项卡效果

    2024-04-22 22:23:34
  • Python将list元素转存为CSV文件的实现

    2022-03-14 20:15:00
  • asp和js两种方法判断远程图片是否存在

    2007-09-21 17:27:00
  • Python爬虫爬取杭州24时温度并展示操作示例

    2022-01-04 14:43:33
  • python 模拟登陆github的示例

    2022-01-05 17:52:41
  • MySQL 1303错误的解决方法(navicat)

    2024-01-25 21:24:42
  • golang实现unicode转换为字符串string的方法

    2024-05-09 09:30:44
  • asp之家 网络编程 m.aspxhome.com