亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

實現SQL Server 原生數據從XML生成JSON數據的實例代碼

2024-08-31 01:04:48
字體:
來源:轉載
供稿:網友

實現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數據,詳解SQL,原生數據從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,那配置就會非常簡單了,也能夠大量減輕應用服務器的壓力!

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


注:相關教程知識閱讀請移步到MSSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
美日韩精品免费观看视频| 91视频免费在线| 成人做爽爽免费视频| 国产精品v片在线观看不卡| 国产欧美日韩高清| 日韩中文在线中文网在线观看| 国产精品爽黄69| 欧美最顶级丰满的aⅴ艳星| 亚洲精品免费网站| 97在线观看视频国产| 亚洲视频在线观看视频| 日韩精品极品视频免费观看| 国产精品久久久久久亚洲影视| 一本色道久久综合亚洲精品小说| 欧美电影电视剧在线观看| 亚洲第一区在线| 精品久久久999| 在线亚洲国产精品网| 亚洲欧美第一页| 亚洲国产精品久久91精品| 成人性生交xxxxx网站| 成人激情黄色网| 中文国产亚洲喷潮| 欧美成人免费在线观看| 日韩精品日韩在线观看| 欧美日韩第一页| 色诱女教师一区二区三区| 欧美电影电视剧在线观看| 亚洲精品久久久久久久久| 性欧美暴力猛交69hd| 国产精自产拍久久久久久蜜| 久久精品国产免费观看| 成人黄色激情网| 欧美日韩999| 国产精品国产三级国产aⅴ浪潮| 国产精品久久久久aaaa九色| 91国在线精品国内播放| 精品久久久久久久久中文字幕| 日本高清不卡的在线| 高清欧美一区二区三区| 成人综合国产精品| 欧美日韩亚洲成人| 亚洲精品国产美女| 亚洲天堂影视av| 92看片淫黄大片看国产片| 欧美极品少妇全裸体| 日本高清视频一区| www.美女亚洲精品| 国产精品日韩专区| www国产亚洲精品久久网站| 亚洲美女在线视频| 亚洲综合色激情五月| 成人激情av在线| 最近2019免费中文字幕视频三| 亚洲精品中文字幕有码专区| 欧美成人午夜激情在线| 国产欧美一区二区白浆黑人| 中文字幕亚洲欧美日韩高清| 日韩久久午夜影院| 久久人人爽人人爽人人片av高请| 91日本在线视频| 国产精品欧美久久久| 久久香蕉国产线看观看网| 欧美国产日韩免费| 国产精品99蜜臀久久不卡二区| 日韩高清电影免费观看完整| 这里只有视频精品| 中文字幕精品www乱入免费视频| 亚洲国产毛片完整版| 国产精品视频色| 中文字幕欧美日韩va免费视频| 欧美男插女视频| 91亚洲精品在线观看| 日本一区二区在线免费播放| 欧美激情精品久久久久久免费印度| 亚洲色图国产精品| 久久精品在线播放| 清纯唯美日韩制服另类| 国产成人精品网站| 国产欧美一区二区三区在线看| 91久久久久久久久| 日韩欧美aⅴ综合网站发布| 亚洲白虎美女被爆操| 日韩欧美a级成人黄色| 成人xxxx视频| 日本欧美黄网站| 国内精品久久久久| 国产欧美日韩亚洲精品| 成人a在线视频| 尤物99国产成人精品视频| 亚洲xxxxx电影| 久久久久免费精品国产| 日韩电视剧在线观看免费网站| 久久精品国产2020观看福利| 91黑丝高跟在线| 亚洲人成电影网站色xx| 国产精品日韩久久久久| 亚洲最大福利网站| 热99在线视频| 日本不卡免费高清视频| 欧美国产视频一区二区| 日韩欧美在线中文字幕| 777国产偷窥盗摄精品视频| 成人福利网站在线观看| 成人免费观看a| 亚洲国内精品在线| 久久久免费高清电视剧观看| 午夜精品久久久99热福利| 欧美激情亚洲另类| 福利一区视频在线观看| 欧美电影院免费观看| 亚洲影院色无极综合| 亚洲乱亚洲乱妇无码| 按摩亚洲人久久| 国产a级全部精品| 亚洲精品成人av| 国产成人免费91av在线| 欧美肥臀大乳一区二区免费视频| 欧美激情视频给我| 日韩激情视频在线| 欧美色图在线视频| 亚洲尤物视频网| 亚洲欧美综合区自拍另类| 日韩在线观看免费全集电视剧网站| 91精品国产成人www| 亚州欧美日韩中文视频| 日本亚洲欧美成人| 日韩欧美高清视频| 最近中文字幕mv在线一区二区三区四区| 成人国产精品色哟哟| 2019国产精品自在线拍国产不卡| 国产一区二区三区精品久久久| 国内精品久久久久| 福利一区福利二区微拍刺激| 国产精品永久免费观看| 亚洲欧洲激情在线| 久久九九有精品国产23| 日韩高清不卡av| 国产精品视频xxx| 亚洲a区在线视频| 中文字幕少妇一区二区三区| 亚洲第一免费网站| 日韩av色在线| 日本三级韩国三级久久| 久热精品视频在线| 欧美精品videos性欧美| 久久精品久久精品亚洲人| 中文字幕欧美日韩在线| 久久成人免费视频| 日韩中文字幕免费视频| 狠狠躁天天躁日日躁欧美| 国产盗摄xxxx视频xxx69| 亚洲精品一区二区在线| 亚洲免费小视频| 欧美激情伊人电影| 欧美在线影院在线视频| 欧美性在线视频| 神马久久久久久| 亚洲高清av在线| 欧洲中文字幕国产精品| 国外成人在线直播| 8090成年在线看片午夜| 欧美老女人性视频| 久久国产精品视频|