天天看點

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啊?

       等待半天提示錯誤:在SQL目錄中找不到程式集:system.core, version=3.5.0.0 這裡我又暈了半天,如何把這個東東搞進SQL的目錄呢?終于有位仁兄說:

       SQL SERVER并不支援System.Core.dll程式集,應先加載:

EXEC dbo.sp_changedbowner @loginame = N'sa', @map = true  

GO  

sp_configure 'clr enabled', 1  

RECONFIGURE  

ALTER DATABASE [stzpbbs] SET TRUSTWORTHY ON  

CREATE ASSEMBLY [System.Core]  

AUTHORIZATION [dbo]  

FROM   

'C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll'  

WITH PERMISSION_SET = UNSAFE  

      改成自己的資料庫名稱,執行,成功,點開資料庫的程式集目錄,果然有了,那就再部署、、、、、又提示在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字元串了,内容如下:

using System;  

using System.Data;  

using System.Data.SqlClient;  

using System.Data.SqlTypes;  

using Microsoft.SqlServer.Server;  

using Newtonsoft.Json;  

using Newtonsoft.Json.Linq;  

public partial class UserDefinedFunctions  

{  

    [Microsoft.SqlServer.Server.SqlFunction]  

    public static SqlString Json(string json,string key)  

    {  

        // 在此處放置代碼  

        JObject ja = (JObject)JsonConvert.DeserializeObject(json);  

        string re = ja[key].ToString();  

        return new SqlString(re);  

    }  

    public static SqlString JsonArray(string json,int s, string key)  

        JArray ja = (JArray)JsonConvert.DeserializeObject(json);  

        string re = ja[s][key].ToString();  

};  

       最後部署,資料庫中調用方法:

print dbo.Json('{key:"001",value:"你好"}','value')  

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

你好  

不好  

申明:作者寫博是為了總結經驗,和交流學習之用。

如需轉載,請盡量保留此申明,并在文章頁面明顯位置給出原文連接配接。謝謝!