原文 SQL中采用Newtonsoft.Json处理json字符串

使用环境:

SQL Server2005;

VS2010;

关于SQL中部署CLR程序集的方法,网上一搜一大把,需要了解的自行查阅,呵呵。

SQL中处理字符串实在是太弱了,连数组都不能处理,就更别说json字符串了,好吧,它不能处理,我就给它加个处理程序集(还好2005已经加入了这个功能)。

首先对于CLR我也不太懂,而且到现在我也没搞懂怎么把一个dll注册到SQL,俺是直接用VS2010新建一个sql sever的数据库项目,然后部署到SQL,能省多少操作就省多少操作。

这里说一下CLR 数据库项目,第一次开发实在没搞懂引用竟然不能选择本地的Newtonsoft.Json.dll文件,而且好多c#类库也没有,这让我怎么使用Newtonsoft.Json啊?

好吧,我做了最笨的办法,直接将Newtonsoft.Json的源码复制进我的项目里面,错误是一大堆一大堆,首先是.net版本 检测错误,后面直接使用.net3.5的方法(2005不支持4.0或以上的.net版本),把多余的全删了,后面发现竟然在这个项目中没有System.Runtime.Serialization中的全部类,比如EnumMemberAttribute就木有,好吧,我再把这个类的代码复制过来,ok,一一复制结束,编译,哈哈,没错了!开始部署吧。

等待半天提示错误:在SQL目录中找不到程序集:system.core, version=3.5.0.0 这里我又晕了半天,如何把这个东东搞进SQL的目录呢?终于有位仁兄说:

SQL SERVER并不支持System.Core.dll程序集,应先加载:

  1. EXEC dbo.sp_changedbowner @loginame = N'sa', @map = true
  2. GO
  3. sp_configure 'clr enabled', 1
  4. GO
  5. RECONFIGURE
  6. GO
  7. ALTER DATABASE [stzpbbs] SET TRUSTWORTHY ON
  8. GO
  9. CREATE ASSEMBLY [System.Core]
  10. AUTHORIZATION [dbo]
  11. FROM
  12. 'C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll'
  13. WITH PERMISSION_SET = UNSAFE
  14. GO

改成自己的数据库名称,执行,成功,点开数据库的程序集目录,果然有了,那就再部署、、、、、又提示在SQL目录中找不到程序集:System.Xml.Linq,那意思刚才的system.core已经引入正确了,到这里,我没有再继续下去了,既然system.core可以直接引入数据库,Newtonsoft.Json行不行呢?顺这个思路,总共需要引入的库有:

System.Core.dll

System.Xml.Linq.dll

SMdiagnostics.dll

System.Runtime.Serialization.dll

Newtonsoft.Json.dll

注意,PERMISSION_SET = UNSAFE  ,全部设置为unsafe。

Newtonsoft.Json.dll添加成功后,再打开vs2010新建数据库项目,添加引用,在列表就能看到Newtonsoft.Json这个库 了,哈哈,点击引用,新建用户自定义函数,现在可以直接使用Newtonsoft.Json的方法反序列化json字符串了,内容如下:

  1. using System;
  2. using System.Data;
  3. using System.Data.SqlClient;
  4. using System.Data.SqlTypes;
  5. using Microsoft.SqlServer.Server;
  6. using Newtonsoft.Json;
  7. using Newtonsoft.Json.Linq;
  8. public partial class UserDefinedFunctions
  9. {
  10. [Microsoft.SqlServer.Server.SqlFunction]
  11. public static SqlString Json(string json,string key)
  12. {
  13. // 在此处放置代码
  14. JObject ja = (JObject)JsonConvert.DeserializeObject(json);
  15. string re = ja[key].ToString();
  16. return new SqlString(re);
  17. }
  18. [Microsoft.SqlServer.Server.SqlFunction]
  19. public static SqlString JsonArray(string json,int s, string key)
  20. {
  21. // 在此处放置代码
  22. JArray ja = (JArray)JsonConvert.DeserializeObject(json);
  23. string re = ja[s][key].ToString();
  24. return new SqlString(re);
  25. }
  26. };

最后部署,数据库中调用方法:

  1. print dbo.Json('{key:"001",value:"你好"}','value')
  2. print dbo.JsonArray('[{key:"001",value:"你好"},{key:"002",value:"不好"}]',1,'value')
  1. 你好
  2. 不好
作者:kunoy

申明:作者写博是为了总结经验,和交流学习之用。
如需转载,请尽量保留此申明,并在文章页面明显位置给出原文连接。谢谢!

SQL中采用Newtonsoft.Json处理json字符串的更多相关文章

  1. SQL零星技术点:SQL中转换money类型数值转换为字符串问题

    --SQL中转换money类型数值转换为字符串问题,直接转换就转为两位了,所以需要做一下处理.具体请看下述sql实例. 1 create table #test(price money) insert ...

  2. sql中的for xml path() 实现字符串拼接

       通常我们需要在sql中拼接字符串   ,可以用for xml path() 来进行拼接,如下实例. 同时未去掉最后一个逗号可以用LEFT函数来实现.     ) AS UserName  FRO ...

  3. SQL中CONVERT()转化函数的用法 字符串转日期

    SELECT CONVERT(varchar(), GETDATE(), ): :57AM SELECT CONVERT(varchar(), GETDATE(), ): // SELECT CONV ...

  4. SQL中得到最后一个“-”后面的字符串

    declare @str varchar(50) set @str='-'+'1-9-3-2'--前面加个'-'防止没有'-'出错 select REVERSE(SUBSTRING(REVERSE(@ ...

  5. 使用 Newtonsoft.Json 操作 JSON 字符串

    一.把实体类转化为 JSON 字符串 1. 为实体类赋值 SenderFromMQSearch senderFromMQSearch = new SenderFromMQSearch(); sende ...

  6. Newtonsoft.Json 操作 JSON 字符串

    Newtonsoft.Json介绍 在做开发的时候,很多数据交换都是以json格式传输的.而使用Json的时候,我们很多时候会涉及到几个序列化对象的使用:DataContractJsonSeriali ...

  7. 基于 Vue.js 之 iView UI 框架非工程化实践记要 使用 Newtonsoft.Json 操作 JSON 字符串 基于.net core实现项目自动编译、并生成nuget包 webpack + vue 在dev和production模式下的小小区别 这样入门asp.net core 之 静态文件 这样入门asp.net core,如何

    基于 Vue.js 之 iView UI 框架非工程化实践记要   像我们平日里做惯了 Java 或者 .NET 这种后端程序员,对于前端的认识还常常停留在 jQuery 时代,包括其插件在需要时就引 ...

  8. [转]C# JSON格式的字符串读取到类中

    将JSON格式的字符串读取到类中 本例中建立JSON格式的字符串json,将其内容读取到Person类中 运行本代码需要添加引用动态库Newtonsoft.Json 程序代码: using Syste ...

  9. 在PHP代码中处理JSON 格式的字符串的两种方法:

    总结: 在PHP代码中处理JSON 格式的字符串的两种方法: 方法一: $json= '[{"id":"1","name":"\u ...

随机推荐

  1. Javascript 基础编程练习一

    Javascript 基础互动编程,这篇练习结合了function 函数名(), onclick 时间, prompt输入窗口, window.open和confirm窗口, 任务 1.新窗口打开时弹 ...

  2. JavaSE思维导图(四)

  3. 在 Visio 中录制宏

    在“开发工具”选项卡上,单击“录制宏”.(如果您看不到“开发工具”选项卡,请参阅下面的“显示‘开发工具’选项卡”.) 在“宏名”框中,键入宏名称. 在“快捷键”框中,键入与 Ctrl 键一起使用可运行 ...

  4. BZOJ 2434: [Noi2011]阿狸的打字机( AC自动机 + DFS序 + 树状数组 )

    一个串a在b中出现, 那么a是b的某些前缀的后缀, 所以搞出AC自动机, 按fail反向建树, 然后查询(x, y)就是y的子树中有多少是x的前缀. 离线, 对AC自动机DFS一遍, 用dfs序+树状 ...

  5. 用C++写一个简单的服务器和客户端

    我们将创建一个服务器节点add_two_ints_server,它将会收到两个整数,并且返回它们的和.切换目录到之前建立的beginner_tutorials包下: cd ~/catkin_ws/sr ...

  6. MarkDown使用 (一)

    MarkDown的数学公式输入 MarkDown的数学公式输入 1.如何插入公式 LaTeX的数学公式有两种:行中公式和独立公式.行中公式放在文中与其它文字混编,独立公式单独成行. 行中公式可以用如下 ...

  7. IIS上不能播放mp4

    iis不支持mp4格式,需要手动添加. 进入iis服务管理器,打开你的网站,然后点击MIME类型---添加(扩展名:mp4   MIME类型:application/octet-stream) 如此即 ...

  8. BUAA 更大公约数

    题目链接 给一个n*m的矩阵, 删除里面的一行一列, 使得剩下的数的最大公约数最大. 一个格子(x,y), 先预处理出(1,1)到这个格子的内所有数的最大公约数, 同理处理出(1, m), (n, m ...

  9. linux 使用者管理

    1.用户标识符 UID  用户ID GID  用户组ID 2./etc/passwd 文件结构 id范围:0系统管理员|1~499 (系统账号)|500~65535 可登录账号

  10. 如何解决dns解析故障

    在实际应用过程中可能会遇到DNS解析错误的问题,就是说当我们访问一个域名时无法完成将其解析到IP地址的工作,而直接输入网站IP却可以正常访问,这就是因为DNS解析出现故障造成的.这个现象发生的机率比较 ...