借助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.        }
  21.        [Microsoft.SqlServer.Server.SqlFunction(Name = "Json2Xml")]
  22.        public
    static SqlXml Json2Xml(string json)
  23.        {
  24.            System.Xml.XmlDocument doc = JsonConvert.DeserializeXmlNode(json);
  25.            System.IO.StringWriter sw = new System.IO.StringWriter();
  26.            doc.WriteTo(new System.Xml.XmlTextWriter(sw));
  27.            return
    new SqlXml(new System.Xml.XmlTextReader(new System.IO.StringReader(sw.ToString())));
  28.  
  29.        }
  30.        [Microsoft.SqlServer.Server.SqlProcedure(Name = "Json2Table")]
  31.        public
    static
    void Json2Table(string path, string json)
  32.        {
  33.            System.Xml.XmlDocument doc = JsonConvert.DeserializeXmlNode(json);
  34.            System.Xml.XmlNodeList list = null;
  35.            if (!string.IsNullOrEmpty(path))
  36.                list = doc.SelectNodes(path);
  37.            else
  38.                list = doc.ChildNodes;
  39.            if (list == null || list.Count == 0)
  40.                return;
  41.            List<SqlMetaData> metas = new List<SqlMetaData>();
  42.            string lastName = "";
  43.            bool flag = false;
  44.            for (int i = 0; i < list[0].ChildNodes.Count; i++)
  45.            {
  46.                if (lastName == list[0].ChildNodes[i].Name)
  47.                {
  48.                    flag = true;
  49.                    break;
  50.                }
  51.                else
  52.                    lastName = list[0].ChildNodes[i].Name;
  53.                metas.Add(new SqlMetaData(list[0].ChildNodes[i].Name, SqlDbType.NVarChar, SqlMetaData.Max));
  54.            }
  55.            var rec = new SqlDataRecord(metas.ToArray());
  56.            SqlContext.Pipe.SendResultsStart(rec);
  57.            foreach (System.Xml.XmlNode node in list)
  58.            {
  59.                if (flag)//行模式
  60.                    for (int i = 0; i < node.ChildNodes.Count; i++)
  61.                    {
  62.                        rec.SetString(0, node.ChildNodes[i].InnerXml);
  63.                        SqlContext.Pipe.SendResultsRow(rec);
  64.                    }
  65.                else
  66.                {
  67.                    for (int i = 0; i < metas.Count; i++)
  68.                    {
  69.                        rec.SetString(i, node.ChildNodes[i].InnerXml);
  70.                    }
  71.                    SqlContext.Pipe.SendResultsRow(rec);
  72.                }
  73.            }
  74.  
  75.  
  76.            SqlContext.Pipe.SendResultsEnd();
  77.  
  78.        }
  79.        //public static void Json2Table(string json)
  80.        //{
  81.        // //find first array
  82.        // Q.Json.Linq.JObject jo = JsonConvert.DeserializeObject(json) as Q.Json.Linq.JObject;
  83.        // Q.Json.Linq.JToken token = jo.First;
  84.        // while (token != null && token.Type != Q.Json.Linq.JTokenType.Array)
  85.        // {
  86.        // token = token.First;
  87.        // }
  88.        // if (token == null)
  89.        // return;
  90.        // Q.Json.Linq.JArray array = token as Q.Json.Linq.JArray;
  91.        // if (array.Count == 0)
  92.        // return;
  93.        // List<SqlMetaData> metas = new List<SqlMetaData>();
  94.        // token = array[0].First;
  95.        // while (token != null)
  96.        // {
  97.        // metas.Add(new SqlMetaData((token as Q.Json.Linq.JProperty).Name, SqlDbType.NVarChar, SqlMetaData.Max));
  98.        // token = token.Next;
  99.        // }
  100.  
  101.        // var rec = new SqlDataRecord(metas.ToArray());
  102.        // SqlContext.Pipe.SendResultsStart(rec);
  103.        // foreach (var item in array)
  104.        // {
  105.        // for (int i = 0; i < metas.Count; i++)
  106.        // {
  107.        // rec.SetString(i, item[metas[i].Name].ToString());
  108.        // }
  109.        // SqlContext.Pipe.SendResultsRow(rec);
  110.        // }
  111.        // SqlContext.Pipe.SendResultsEnd();
  112.  
  113.        //}
  114.    }

 

 
 

测试语句

 
 

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

  

SQL2008使用json.net实现XML与JSON互转的更多相关文章

  1. org.json里实现XML和JSON之间对象互转

    org.json包里有一个类org.json.XML可以实现XML和JSON之间的转换.http://www.json.org/javadoc/org/json/XML.html JSONObject ...

  2. 什么是json? 什么是xml?JSON与XML的区别比较

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它使得人们很容易的进行阅读和编写.同时也方便了机器进行解析和生成.它是基于 JavaScript Prog ...

  3. ASP.NET中的XML和JSON

    一.DOM简介 1.XML 定义:XML是一种跨语言.跨平台的数据储存格式 2.什么是DOM DOM(document object model)文档对象模型:是一种允许程序或脚本动态的访问更新文档内 ...

  4. XML与JSON的对比

    XML与JSON的对比 1.各自定义 XML 扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类 ...

  5. ASP.NET中XML转JSON的方法

    原文:ASP.NET中XML转JSON的方法 许多应用程序都将数据存储为XML的格式,而且会将数据以JSON的格式发送到客户端以做进一步处理.要实现这一点,它们必须将XML格式转换为JSON格式. X ...

  6. xml转换为json格式时,如何将指定节点转换成数组 Json.NET

    使用Json.NET转换xml成json时,如果xml只有单个节点,但json要求是数组形式[], JsonConvert.SerializeXmlNode 并不能自动识别 示例如下: RecordA ...

  7. java 中xml转换为json对象

    1.前提须要jar包: json-lib-2.4-jdk15.jar 和 xom-1.2.5.jar ,maven 仓库: net.sf.json-lib json-lib 2.4 jdk15 xom ...

  8. JSON对象与XML相互转换工具类

    依赖jar <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId ...

  9. UI:数据的解析XML与JSON

    XML  和  JSON 语言  本篇博客来自互联网参考 XML 和 JSON 的互相转化 有属性的转化为对象,无属性的转化为字符串 节点的顺序性不可逆,XML有顺序,JSON 无顺序 XML 和 J ...

随机推荐

  1. MySQL学习笔记七:存储引擎

    1.MySQL存储引擎的设计采用“插件式”方案,用户可以很方便地选择使用哪种存储引擎,想使用mysql没有提供的引擎时,可以自己安装进去. 查看支持的存储引擎 mysql> show engin ...

  2. DB2 Enterprise Server Edition(DB2 ESE)9.1在Windows Server 2008 下出现无法新建数据库的情况,及解决办法

    在安装有,DB2 9.1版本的Windows Server 2008 上面,使用默认的安装方式导致无法创建数据库,相关的错误提示: "SQL3012C 发生系统错误(原因码= "& ...

  3. 使用canvas截图或者改变灰度

    简述 html5新添加的canvas API可以让我们对画布进行开发应用,典型的是可以使用canvas截图或者 手工绘制“迷你图”(即嵌入在文本中的高清小图片). 实现截图的方法很简单,就是创建一个c ...

  4. 将文本文件的内容存储在DataSet中的方法总结

    项目中比较多的会对文件进行操作,例如文件的上传下载,文件的压缩和解压等IO操作.在.NET项目中较多的会使用DataSet,DataTable进行数据的缓存. 项目中对文本文件的操作比较简单,但是如果 ...

  5. phpStorm入门

    首先在官网上下载并安装:http://www.jetbrains.com/phpstorm/; 安装成功后需要激活: IntelliJ IDEA开源社区 提供了如下通用激活方法: 注册时选择Licen ...

  6. 新浪云SAE使用入门,教你如何发布自己的网站

    新浪云sae是一个免费的web服务器,SAE的Web服务器采用分布式部署的方式,开发者将代码部署到SAE前端机后,会通过同步的方式,将代码部署到SAE所有的Web服务器.相当于在每一台Web服务器上都 ...

  7. C# GDI+ 处理文本的两个小技巧

    private void button7_Click(object sender, EventArgs e) { Graphics g = this.CreateGraphics(); g.FillR ...

  8. C#如何创建泛型类T的实例

    最近在学历基类的写法时,遇到了一个问题:如何怎么创建一个泛型类T的实例呢?     废话不多说了,直接上代码吧,目前发现三种方法,先贴上,以后再总结,希望能帮助跟我遇到同样问题的朋友. 方法一,通过外 ...

  9. C#集合--Dictionary

    字典(dictionary)是一个集合,其中每个元素都是一个键/值对.字典(Dictionaries)是常用于查找和排序的列表. .NET Framework通过IDictionary接口和IDict ...

  10. IM聊天系统

    先上图片: c# 客户端,openfire服务端,基于java开源推送服务开发的及时聊天系统.大概功能有,单点消息支持文本/图片/截图/音频/视频发送直接播放/视频聊天/大文件传输/动态自定义表情等. ...