SQL2008使用json.net實現XML與JSON互轉

借助CLR,首先實現字符串的互轉,然后使用存儲過程實現JSON2table

? ?

  1. public class JsonFunction
  2. ???{
  3. ???????/// <summary>
  4. ???????/// XML轉JSON
  5. ???????/// </summary>
  6. ???????/// <param name="xml"></param>
  7. ???????/// <returns></returns>
  8. ???????/// <remarks>
  9. ???????/// json不建議太長
  10. ???????/// </remarks>
  11. ???????[Microsoft.SqlServer.Server.SqlFunction(Name = "Xml2Json")]
  12. ???????public static SqlString Xml2Json(SqlXml xml)
  13. ???????{
  14. ???????????System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
  15. ???????????doc.LoadXml(xml.Value);
  16. ???????????string json = JsonConvert.SerializeXmlNode(doc, Formatting.Indented);
  17. ???????????doc.Clone();
  18. ???????????return new SqlString(json);
  19. ???????}
  20. ???????[Microsoft.SqlServer.Server.SqlFunction(Name = "Json2Xml")]
  21. ???????public static SqlXml Json2Xml(string json)
  22. ???????{
  23. ???????????System.Xml.XmlDocument doc = JsonConvert.DeserializeXmlNode(json);
  24. ???????????System.IO.StringWriter sw = new System.IO.StringWriter();
  25. ???????????doc.WriteTo(new System.Xml.XmlTextWriter(sw));
  26. ???????????return new SqlXml(new System.Xml.XmlTextReader(new System.IO.StringReader(sw.ToString())));
  27. ???????}
  28. ???????[Microsoft.SqlServer.Server.SqlProcedure(Name = "Json2Table")]
  29. ???????public static void Json2Table(string path, string json)
  30. ???????{
  31. ???????????System.Xml.XmlDocument doc = JsonConvert.DeserializeXmlNode(json);
  32. ???????????System.Xml.XmlNodeList list = null;
  33. ???????????if (!string.IsNullOrEmpty(path))
  34. ???????????????list = doc.SelectNodes(path);
  35. ???????????else
  36. ???????????????list = doc.ChildNodes;
  37. ???????????if (list == null || list.Count == 0)
  38. ???????????????return;
  39. ???????????List<SqlMetaData> metas = new List<SqlMetaData>();
  40. ???????????string lastName = "";
  41. ???????????bool flag = false;
  42. ???????????for (int i = 0; i < list[0].ChildNodes.Count; i++)
  43. ???????????{
  44. ???????????????if (lastName == list[0].ChildNodes[i].Name)
  45. ???????????????{
  46. ???????????????????flag = true;
  47. ???????????????????break;
  48. ???????????????}
  49. ???????????????else
  50. ???????????????????lastName = list[0].ChildNodes[i].Name;
  51. ???????????????metas.Add(new SqlMetaData(list[0].ChildNodes[i].Name, SqlDbType.NVarChar, SqlMetaData.Max));
  52. ???????????}
  53. ???????????var rec = new SqlDataRecord(metas.ToArray());
  54. ???????????SqlContext.Pipe.SendResultsStart(rec);
  55. ???????????foreach (System.Xml.XmlNode node in list)
  56. ???????????{
  57. ???????????????if (flag)//行模式
  58. ???????????????????for (int i = 0; i < node.ChildNodes.Count; i++)
  59. ???????????????????{
  60. ???????????????????????rec.SetString(0, node.ChildNodes[i].InnerXml);
  61. ???????????????????????SqlContext.Pipe.SendResultsRow(rec);
  62. ???????????????????}
  63. ???????????????else
  64. ???????????????{
  65. ???????????????????for (int i = 0; i < metas.Count; i++)
  66. ???????????????????{
  67. ???????????????????????rec.SetString(i, node.ChildNodes[i].InnerXml);
  68. ???????????????????}
  69. ???????????????????SqlContext.Pipe.SendResultsRow(rec);
  70. ???????????????}
  71. ???????????}
  72. ???????????SqlContext.Pipe.SendResultsEnd();
  73. ???????}
  74. ???????//public static void Json2Table(string json)
  75. ???????//{
  76. ???????// //find first array
  77. ???????// Q.Json.Linq.JObject jo = JsonConvert.DeserializeObject(json) as Q.Json.Linq.JObject;
  78. ???????// Q.Json.Linq.JToken token = jo.First;
  79. ???????// while (token != null && token.Type != Q.Json.Linq.JTokenType.Array)
  80. ???????// {
  81. ???????// token = token.First;
  82. ???????// }
  83. ???????// if (token == null)
  84. ???????// return;
  85. ???????// Q.Json.Linq.JArray array = token as Q.Json.Linq.JArray;
  86. ???????// if (array.Count == 0)
  87. ???????// return;
  88. ???????// List<SqlMetaData> metas = new List<SqlMetaData>();
  89. ???????// token = array[0].First;
  90. ???????// while (token != null)
  91. ???????// {
  92. ???????// metas.Add(new SqlMetaData((token as Q.Json.Linq.JProperty).Name, SqlDbType.NVarChar, SqlMetaData.Max));
  93. ???????// token = token.Next;
  94. ???????// }
  95. ???????// var rec = new SqlDataRecord(metas.ToArray());
  96. ???????// SqlContext.Pipe.SendResultsStart(rec);
  97. ???????// foreach (var item in array)
  98. ???????// {
  99. ???????// for (int i = 0; i < metas.Count; i++)
  100. ???????// {
  101. ???????// rec.SetString(i, item[metas[i].Name].ToString());
  102. ???????// }
  103. ???????// SqlContext.Pipe.SendResultsRow(rec);
  104. ???????// }
  105. ???????// SqlContext.Pipe.SendResultsEnd();
  106. ???????//}
  107. ???}

?

? ?

測試語句

? ?

  1. DROP TABLE test
  2. CREATE TABLE TEST ( NAME VARCHAR(5), DATA XML )
  3. GO
  4. INSERT INTO TEST
  5. VALUES ( 'A', '<ROOT><M>AAAA</M></ROOT>' )
  6. ????????,
  7. ????????( 'B', '<ROOT><D>00000</D></ROOT>' )
  8. , ( 'C', '123' )
  9. SELECT *
  10. FROM test
  11. --DECLARE @X XML
  12. --SELECT @x = ( SELECT *
  13. -- FROM test
  14. -- FOR
  15. -- XML AUTO ,
  16. -- ELEMENTS ,
  17. -- ROOT
  18. -- )
  19. --SELECT @x
  20. --DECLARE @json NVARCHAR(MAX)
  21. --SELECT @json = dbo.xml2json(@x)
  22. --SELECT @json
  23. --SELECT dbo.Json2Xml(@json)
  24. SELECT dbo.Xml2Json(( SELECT *
  25. ???????????????????????FROM test
  26. ?????????????????????FOR
  27. ???????????????????????XML AUTO ,
  28. ???????????????????????????ELEMENTS ,
  29. ???????????????????????????ROOT
  30. ?????????????????????)) xml2json
  31. SELECT dbo.Json2Xml(dbo.Xml2Json(( SELECT *
  32. ????????????????????????????????????FROM test
  33. ??????????????????????????????????FOR
  34. ????????????????????????????????????XML AUTO ,
  35. ????????????????????????????????????????ELEMENTS ,
  36. ????????????????????????????????????????ROOT
  37. ??????????????????????????????????))) json2xml
  38. DECLARE @json NVARCHAR(MAX)
  39. SET @json = dbo.Xml2Json(( SELECT *
  40. ???????????????????????????FROM test
  41. ?????????????????????????FOR
  42. ???????????????????????????XML AUTO ,
  43. ???????????????????????????????ELEMENTS ,
  44. ???????????????????????????????ROOT
  45. ?????????????????????????))
  46. EXECUTE dbo.json2table 'root/test', @json
  47. EXECUTE dbo.json2table '', @json

?

? ?

執行效果

? ?

參考

http://www.json4sql.com/examples.html

? ?

https://www.simple-talk.com/sql/t-sql-programming/consuming-json-strings-in-sql-server/

??

轉載于:https://www.cnblogs.com/QinQouShui/p/4402208.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257456.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257456.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257456.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

黑胡桃木php,揭秘美國黑胡桃木的美

家具是藝術和文化的載體&#xff0c;人們對木的喜愛&#xff0c;是一種與生俱來的情懷。好的木材淳厚質樸、溫潤堅定&#xff0c;有著不動聲色的力量。美國黑胡桃木(亦稱黑核桃木)便是如此&#xff0c;“身體”中散發著讓人無法抗拒的魅力&#xff01;美國黑胡桃木體現的是“深…

c mysql備份還原數據庫,MySQL數據庫備份與恢復方法

常有新手問我該怎么備份數據庫&#xff0c;下面介紹3種備份數據庫的方法&#xff1a;(1)備份數據庫文件MySQL中的每一個數據庫和數據表分別對應文件系統中的目錄和其下的文件。在Linux下數據庫文件的存放目錄一般為/var/lib/mysql。在Windows下這個目錄視MySQL的安裝路徑而定&a…

第四篇:白話tornado源碼之褪去模板外衣的前戲

加班程序員最辛苦&#xff0c;來張圖醒醒腦吧&#xff01; ... ... ... 好了&#xff0c;醒醒吧&#xff0c;回歸現實看代碼了&#xff01;&#xff01; 執行字符串表示的函數&#xff0c;并為該函數提供全局變量 本篇的內容從題目中就可以看出來&#xff0c;就是為之后剖析tor…

生活常識

雷雨天野外要關手機 溫漢華介紹&#xff0c;雷雨天&#xff0c;山頂空曠處容易遭雷電襲擊。 他同時提醒&#xff0c;若游客在山上游覽時&#xff0c;遭遇到電閃雷鳴的暴雨天氣時&#xff0c;一定要注意以下事項&#xff1a; 其一&#xff0c;關停自己的手機。 其二&#xff0c;…

主程序分析法MATLAB編程,專題五??概率統計問題的Matlab求解

【實驗目的及要求】I&#xff0e;熟練掌握Matlab編程中常見概率分布的概率密度、概率分布、逆分布、均值和方差等語句的調用格式&#xff0c;學會用Matlab對服從各種分布的樣本進行參數估計和假設檢驗。對實際問題&#xff0c;能夠進行樣本的分析&#xff0c;得出服從哪種分布的…

LFS(Linux From Scratch)學習

一、環境準備 使用Debian平臺&#xff0c;需做如下環境檢查&#xff1a; 1、檢查各個需要的工具及內核版本號&#xff0c;看看是否符合lfs7.7的列表要求 2、檢查需要用到的庫&#xff0c;一共有三個&#xff0c;gmp, mpfr和mpc 工具檢查腳本如下&#xff1a; #filename:check_e…

騰訊云 Centos 配置 JDK Tomcat Mysql

配置JDK 從 oracle 官網下載 rpm 版本的 jdk 包,官方鏈接:點擊此處跳轉。下載jdk的時候記得看一看自己的系統是 64 位還是 32 位的&#xff0c;下對應的版本。下載好以后上傳到騰訊云服務器中,命令格式為 scp &#xff3b;文件路徑] &#xff3b;云主機用戶名ip地址]:[服務器上…

php 取url根域名,php中取得URL的根域名的代碼

/*** 取得根域名** author lonely* create 2011-3-11* version 0.1* lastupdate lonely* package Sl*/class Sl_RootDomain{private static $self;private $domainnull;private $hostnull;private $state_domain;private $top_domain;/*** 取得域名分析實例* Enter description…

如何創建sequence

我用的是在oracle中的方法&#xff0c;在oracle中sequence就是所謂的序列號&#xff0c;每次取的時候它會自動增加&#xff0c;一般用在需要按序列號排序的地方。 1、Create Sequence 你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE權限&#xff0c; CREATE SEQUENCE SI_E…

簡易版jQuery——mQuery

前面的話 雖然jQuery已經日漸式微&#xff0c;但它里面的許多思想&#xff0c;如選擇器、鏈式調用、方法函數化、取賦值合體等&#xff0c;有的已經變成了標準&#xff0c;有的一直影響到現在。所以&#xff0c;jQuery是一個偉大的前端框架。前端世界日新月異&#xff0c;由于實…

LaTeX?安裝配置?OSX

LaTeX 安裝配置 OSX官方網站&#xff1a;http://www.latex-project.orghttp://www.tug.org/mactex/http://pages.uoregon.edu/koch/BasicTeX.pdf完整的Tex超過2G&#xff0c;一般用戶沒必要&#xff0c;可以先安裝BasicTeX&#xff0c;當有需要時include必要的庫即可1.安裝Basi…

php 正三角塔,PHP 環境塔建與數據類型轉換

手動塔建PHP開發環境安裝php c:\apps\php安裝apache c:\apps\apache1.配制apache配制c:\apps\apache\conf\httpd.confDocumentRoot"c:/apps/www" //指定工作目錄,WWW為自已創健Directoryindex index.php index.html // 加入:loadModule php5_module "c:\apps\PH…

C/C++基礎知識:函數指針和指針函數的基本概念

【函數指針】 在程序運行中&#xff0c;函數代碼是程序的算法指令部分&#xff0c;它們和數組一樣也占用存儲空間&#xff0c;都有相應的地址。可以使用指針變量指向數組的首地址&#xff0c;也可以使用指針變量指向函數代碼的首地址&#xff0c;指向函數代碼首地址的指針…

告警系統郵件引擎

2019獨角獸企業重金招聘Python工程師標準>>> 20.23-20.25 告警系統郵件引擎 創建發郵件的腳本——mail.py [rootlocalhost mail]# pwd /usr/local/sbin/mon/mail[rootlocalhost mail]# vim mail.py #!/usr/bin/env python #-*- coding: UTF-8 -*- import os,sys rel…

【HTTP 2】簡介(Introduction)

前情提要 在上一篇文章《【HTTP 2.0】 序言》中&#xff0c;我們簡要介紹了 HTTP 2 協議的概要和協議狀態。 在本篇文章中&#xff0c;我們將會了解到 HTTP 2 協議簡介&#xff08;Introduction&#xff09;部分的內容。 簡介&#xff08;Introduction&#xff09; 超文本傳輸協…

java測試類生成對象,java編寫student類 用Java編寫一段測試程序,生成student類的兩個對象,并輸出每個對象基本信息?...

java中怎么創建對象數組&#xff1f;比如我創建了一個學生類Student&#xff0c;怎么用這個類創建一個對象數組&#xff0c;麻煩給個例子&#xff1f;學生類&#xff1a;classA{privateStringnameprivateintagepublicStringgetName(){returnname}publicvoidsetName(Stringname)…

iOS -- SKScene類

SKScene類 繼承自SKEffectNode:SKNode:UIResponder:NSObject符合NSCoding(SKNode)NSCopying(SKNode)NSObject(NSObject)框架 /System/Library/Frameworks/SpriteKit.framework可用性可用于iOS 7.0或者更晚的版本聲明于SKScene.h參考指南Sprite Kit Progamming Guide概覽 重要提…

SSD硬盤 全盤安全擦除

此文From http://ssd.zol.com.cn/575/5753057.html 在SSD固態硬盤的使用過程中&#xff0c;部分用戶可能會碰到計算機意外掉電或死機并強行斷電后&#xff0c;系統出現異常&#xff0c;掃描SSD后發現壞塊&#xff0c;然后一著急一跺腳甚至想返廠維修。 其實掉電后固態硬盤出現壞…

php中等3秒再跳轉,跳轉和重定向

頁面跳轉在應用開發中&#xff0c;經常會遇到一些帶有提示信息的跳轉頁面&#xff0c;例如操作成功或者操作錯誤頁面&#xff0c;并且自動跳轉到另外一個目標頁面。系統的ThinkController類內置了兩個跳轉方法success和error&#xff0c;用于頁面跳轉提示&#xff0c;而且可以支…

2017敏捷沙灘大會:完美軟件,測量持續交付,以及探索未來

在英國康沃爾郡舉行的2017敏捷沙灘大會上&#xff0c;數百名演講者和參與者共聚一堂&#xff0c;探討敏捷和后敏捷領域軟件開發方法有哪些最新進展。本次大會最后一個下午的要點包括&#xff1a;交付團隊可以通過擁抱精益、迭代和持續的部署方法更快速地實現業務價值&#xff1…