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

实现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

结果:

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,那配置就会非常简单了,也能够大量减轻应用服务器的压力!

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

(0)

相关推荐

  • php 备份数据库代码(生成word,excel,json,xml,sql)

    单表备份代码: 复制代码 代码如下: <?php    class Db    {        var $conn; function Db($host="localhost",$user="root",$pass="root",$db="test")        {          if(!$this->conn=mysql_connect($host,$user,$pass))          die(

  • SqlServer将查询结果转换为XML和JSON

    很久之前用到的,现在整理在这,里面一些代码来源于网上,不过有些bug已被我修改了. 1.查询结果转XML DECLARE @ParameterSQL NVARCHAR(MAX)='SELECT * FROM table'; DECLARE @SQL NVARCHAR(MAX) DECLARE @XMLString VARCHAR(MAX) DECLARE @XML XML DECLARE @Paramlist NVARCHAR(1000) SET @Paramlist = N'@XML XML

  • SQL Server中将数据导出为XML和Json方法分享

    有时候需要一次性将SQL Server中的数据导出给其他部门的也许进行关联或分析,这种需求对于SSIS来说当然是非常简单,但很多时候仅仅需要一次性导出这些数据而建立一个SSIS包就显得小题大做,而SQL Server的导入导出工具其中BUG还是蛮多的,最简单的办法是BCP.  数据导出为XML 在SQL Server 2005之后提供了一个for xml子句在关系数据库中原生支持XML.通过该命令可以将二维关系结果集转换为XML,通过BCP就可以将数据存为XML了. 例如下面的数据: 我们可以通

  • 在SQL Server中将数据导出为XML和Json的方法

    有时候需要一次性将SQL Server中的数据导出给其他部门的也许进行关联或分析,这种需求对于SSIS来说当然是非常简单,但很多时候仅仅需要一次性导出这些数据而建立一个SSIS包就显得小题大做,而SQL Server的导入导出工具其中BUG还是蛮多的,最简单的办法是BCP. 数据导出为XML 在SQL Server 2005之后提供了一个for xml子句在关系数据库中原生支持XML.通过该命令可以将二维关系结果集转换为XML,通过BCP就可以将数据存为XML了. 例如下面的数据: 我们可以通过

  • SQL SERVER 将XML变量转为JSON文本

    废话不多说了,直接给大家贴代码了. -- create function create function [dbo].[fnXmlToJson] (@XmlData xml) returns nvarchar(max) as begin return (select stuff( (select * from (select ',{'+ stuff( (select ',"'+ coalesce(b.c.value('local-name(.)', 'NVARCHAR(MAX)'),'')+'&

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

    实现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

  • SQL Server如何通过创建临时表遍历更新数据详解

    前言: 前段时间新项目上线为了赶进度很多模块的功能都没有经过详细的测试导致了生成环境中的数据和实际数据对不上,因此需要自己手写一个数据库脚本来更新下之前的数据.(线上数据库用是SQL Server2012)关于数据统计汇总的问题肯定会用到遍历统计汇总,那么问题来了数据库中如何遍历呢?好像并没有for和foreach这种类型的功能呀,不过关于数据库遍历最常见的方法当然是大家经常会想到的游标啦,但是这次我并没有使用游标,而是通过创建临时表的方式来更新遍历数据的. 为什么不使用游标,而使用创建临时表?

  • SQL Server实现显示每个类别最新更新数据的方法

    本文实例讲述了SQL Server实现显示每个类别最新更新数据的方法.分享给大家供大家参考,具体如下: 在项目中经常遇到求每个类别最新显示的数据,比如显示某某某类别最新更新的5条数据.特写下这个sql记录于此: -- ============================================= -- 作者: <Rising_Sun> -- 创建日期: <2012-9-28> -- 描述: <显示每个类别下最新更新的n条数据> -- ============

  • 解析SQL Server CDC配合Kafka Connect监听数据变化的问题

    写在前面 好久没更新Blog了,从CRUD Boy转型大数据开发,拉宽了不少的知识面,从今年年初开始筹备.组建.招兵买马,到现在稳定开搞中,期间踏过无数的火坑,也许除了这篇还很写上三四篇. 进入主题,通常企业为了实现数据统计.数据分析.数据挖掘.解决信息孤岛等全局数据的系统化运作管理 ,为BI.经营分析.决策支持系统等深度开发应用奠定基础,挖掘数据价值 ,企业会开始着手建立数据仓库,数据中台.而这些数据来源则来自于企业的各个业务系统的数据或爬取外部的数据,从业务系统数据到数据仓库的过程就是一个E

  • python解析html提取数据,并生成word文档实例解析

    简介 今天试着用ptyhon做了一个抓取网页内容,并生成word文档的功能,功能很简单,做一下记录以备以后用到. 生成word用到了第三方组件python-docx,所以先进行第三方组件的安装.由于windows下安装的python默认不带setuptools这个模块,所以要先安装setuptools这个模块. 安装 1.在python官网上找到 https://bootstrap.pypa.io/ez_setup.py ,把代码保存到本地并执行: python ez_setup.py 2.下载

  • Python爬虫数据的分类及json数据使用小结

    数据的结构化分类 一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值.内容一般分为三部分,结构化的数据.半结构化的数据和非机构化数据. 1.结构化数据:        可以用统一的结构加以表示的数据.可以使用关系型数据库表示和存储,表现为二维形式的数据,一般特点是:数据以行为单位,一行数据表示一个实体的信息,每一行的数据的属性是相同的. 2.半结构化数据:        结构化数据的一种形式,并不符合关系型数据库或其他数据表的形式关联起来的数据模型结构,但包含相关标记,用

  • vue+mockjs模拟数据实现前后端分离开发的实例代码

    本文介绍了vue+mockjs模拟数据实现前后端分离开发的实例代码,分享给大家,也给自己留个笔记. 在项目中尝试了mockjs,mock数据,实现前后端分离开发. 关于mockjs,官网描述的是 1.前后端分离 2.不需要修改既有代码,就可以拦截 Ajax 请求,返回模拟的响应数据. 3.数据类型丰富 4.通过随机数据,模拟各种场景. 等等优点. 总结起来就是在后端接口没有开发完成之前,前端可以用已有的接口文档,在真实的请求上拦截ajax,并根据mockjs的mock数据的规则,模拟真实接口返回

  • 用原生JS对AJAX做简单封装的实例代码

    首先,我们需要xhr对象.这对我们来说不难,封装成一个函数. var createAjax = function() { var xhr = null; try { //IE系列浏览器 xhr = new ActiveXObject("microsoft.xmlhttp"); } catch (e1) { try { //非IE浏览器 xhr = new XMLHttpRequest(); } catch (e2) { window.alert("您的浏览器不支持ajax,请

  • python实现xml转json文件的示例代码

    使用了Python的 xml.etree.ElementTree 库 xml.etree.ElementTree 库简介 xml.etree.ElementTree模块实现了一个简单而高效的API用于解析和创建XML数据.xml.etree.ElementTree模块对于恶意构造的数据是不安全的.如果您需要解析不受信任或未经验证的数据,请参阅XML漏洞. 参考文献:https://docs.python.org/3.6/library/xml.etree.elementtree.html fro

  • 往xml中更新节点的实例代码

    往xml中更新节点的实例代码 /* System.out.println("2323"); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder docbuilder = factory.newDocumentBuilder(); Document parse = docbuilder .parse(new File("src/ProdQuery.xml&q

随机推荐