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.mzph.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…

LFS(Linux From Scratch)学习

一、环境准备 使用Debian平台&#xff0c;需做如下环境检查&#xff1a; 1、检查各个需要的工具及内核版本号&#xff0c;看看是否符合lfs7.7的列表要求 2、检查需要用到的库&#xff0c;一共有三个&#xff0c;gmp, mpfr和mpc 工具检查脚本如下&#xff1a; #filename:check_e…

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…

告警系统邮件引擎

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; 超文本传输协…

SSD硬盘 全盘安全擦除

此文From http://ssd.zol.com.cn/575/5753057.html 在SSD固态硬盘的使用过程中&#xff0c;部分用户可能会碰到计算机意外掉电或死机并强行断电后&#xff0c;系统出现异常&#xff0c;扫描SSD后发现坏块&#xff0c;然后一着急一跺脚甚至想返厂维修。 其实掉电后固态硬盘出现坏…

2017敏捷沙滩大会:完美软件,测量持续交付,以及探索未来

在英国康沃尔郡举行的2017敏捷沙滩大会上&#xff0c;数百名演讲者和参与者共聚一堂&#xff0c;探讨敏捷和后敏捷领域软件开发方法有哪些最新进展。本次大会最后一个下午的要点包括&#xff1a;交付团队可以通过拥抱精益、迭代和持续的部署方法更快速地实现业务价值&#xff1…

做fzu oj 1045 做减法学到的sprintf()函数

题目 做题一直输不出答案&#xff0c;于是就上网去百度了这题的解题&#xff0c;发现解答十分的简短&#xff0c;而且其中我看见了平时没见过的函数&#xff0c;sprintf()。 于是就百度sprintf()的使用。 如下&#xff1a; 函数功能&#xff1a;把格式化的数据写入某个字符串 函…

动态内存分配及变量存储类别(第二部分)

5. C语言变量的存储类别和生存期 我们知道&#xff0c;变量是有数据类型的&#xff0c;用以说明它占用多大的内存空间&#xff0c;可以进行什么样的操作。除了数据类型&#xff0c;变量还有一个属性&#xff0c;称为“存储类别”。存储类别就是数据在内存中的存放区域。一个正在…

oracle的em能干什么,转载 解决Oracle的EM登录

转载 解决Oracle的EM登录(2011-03-13 20:53:39)标签&#xff1a;杂谈这几天解决了EM无法登录的问题&#xff0c;顺便也把j数据库程序中常出现的ORA_12518错误解决了&#xff0c;有必要总结一下&#xff0c;我最初遇到的情况是这样的&#xff1a;1. 编写java程序访问oracle数据库…

python 回溯法 子集树模板 系列 —— 1、8 皇后问题

问题 88格的国际象棋上摆放八个皇后&#xff0c;使其不能互相攻击&#xff0c;即任意两个皇后都不能处于同一行、同一列或同一斜线上&#xff0c;问有多少种摆法。 分析 为了简化问题&#xff0c;考虑到8个皇后不同行&#xff0c;则每一行放置一个皇后&#xff0c;每一行的皇后…

Android实用代码七段(五)

前言 每次分享意味着每次都有进步&#xff0c;本系列以实用为主&#xff0c;欢迎和我分享和推荐好用的代码段~~声明欢迎转载&#xff0c;但请保留文章原始出处:) 博客园&#xff1a;http://www.cnblogs.com农民伯伯&#xff1a; http://over140.cnblogs.com 正文 1、展开、收起…

ceph Luminous版手动安装零散记录

1.安装必要的依赖包&#xff0c;关防火墙&#xff0c;向/etc/hosts内添加域名等 2.安装ceph 配置yum源 (如果嫌慢&#xff0c;可以配置cachedir/home/yum/$basearch/$releasever和keepcache1两个参数&#xff0c;在第一次安装时将安装包下载到本地做成yum源&#xff0c;给后面的…

C#最简单最完整的webservice实例

我做java&#xff0c;但最近接触crm所以必须研究一下C#中的webservice以备后用&#xff0c;其实就是个新手&#xff0c;哈哈&#xff0c;这个实例是我在参考了网上诸多不完整的例子的情况下&#xff0c;自己摸索完成的。期间遇到过一系列的棘手的问题&#xff0c;经过个人努力终…

51 Nod 1007 正整数分组【类01背包】

1007 正整数分组 基准时间限制&#xff1a;1 秒 空间限制&#xff1a;131072 KB 分值: 10难度&#xff1a;2级算法题将一堆正整数分为2组&#xff0c;要求2组的和相差最小。例如&#xff1a;1 2 3 4 5&#xff0c;将1 2 4分为1组&#xff0c;3 5分为1组&#xff0c;两组和相差1…

iOS富文本

iOS富文本 背景&#xff1a;前些天突然想做一个笔记本功能&#xff0c;一开始&#xff0c;觉得挺简单的呀&#xff0c;一个UITextView,网络缓存也不干了&#xff0c;直接本地NSUserDefault存储&#xff0c;然后完事了&#xff0c;美工&#xff0c;弄几张好看的图片&#xff0c;…

SQL编程题-----1

首先&#xff0c;题目给出这个数据库表格 要求写出SQL语句使之变成如下表格 解决方法&#xff1a; SELECT t1.Rq,t1.胜,t2.负 FROM //t1和t2是自己命的新表格的名字 (SELECT Rq,COUNT(*) AS 胜 //As 胜意思是输出结果时列名为”胜“FROM testtableWHERE Sh…

六角填数---第五届蓝桥杯

/** 如图【1.png】所看到的六角形中&#xff0c;填入1~12的数字。使得每条直线上的数字之和都同样。图中&#xff0c;已经替你填好了3个数字&#xff0c;请你计算星号位置所代表的数字是多少&#xff1f;请通过浏览器提交答案。不要填写多余的内容。*/ public class 六角填数 {…