时间:2021-07-01 10:21:17 帮助过:4人阅读
MSSQLSERVER提供程序集,无疑可以让编程人员更加便捷的操作数据库数据,比如c#写的函数,可以在数据库当作sql的函数使用,你想想他对不熟悉数据库的程序员来说是有多么的嗨。这么好的机制,大家当然不能错过,但是对于数据库变更迁移,可能会存在障碍与不便。所以建议大家在使用sqlsesrver clr程序集的时候也要做个权衡,以免给数据库以后的扩张带来不便。建议大家单次数据,数据过滤,的时候使用sqlserver clr程序集。长期依赖的话,还是另外选择解决方案。
模拟场景:
1、数据库表数据如下
2、问题描述:AreaPoints字段的Json数据格式在c#的第三方json数据解析中是没有问题的。但是他是由多端口调用数据,调用的程序可能是java或者其它语言,那么这种不规范的Json数据格式就不能被解析,这样一来就会存在数据错误。
3、解决方案:这里我就不扯淡啦,方案一定是很多中,今天我切入主体,使用c#的类方法,使不规范的即送数据格式转换成统一规范的Json数据格式。
4、秀具体操作如下。
1、创建c#函数。解决方案下添加--->新建项目
2、添加-->新建项---SQL Server ---SQL CLR C#------SQL CLR C#用户定义的函数
3、创建c#函数方法,不规则json转规范的json格式
- <span style="color: #0000ff;">using</span><span style="color: #000000;"> System;
- </span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Data;
- </span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Data.SqlClient;
- </span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Data.SqlTypes;
- </span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Microsoft.SqlServer.Server;
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">partial</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> UserDefinedFunctions
- {
- [Microsoft.SqlServer.Server.SqlFunction]
- </span><span style="color: #008000;">//</span><span style="color: #008000;">静态方法</span>
- <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span><span style="color: #000000;"> SqlString ToJson1(SqlString str)
- {
- </span><span style="color: #0000ff;">try</span><span style="color: #000000;">
- {
- </span><span style="color: #0000ff;">string</span> json =<span style="color: #000000;"> str.ToString();
- </span><span style="color: #008000;">//</span><span style="color: #008000;">双引号不变</span>
- <span style="color: #0000ff;">if</span> (json.Contains(<span style="color: #800000;">"</span><span style="color: #800000;">\"</span><span style="color: #800000;">"</span><span style="color: #000000;">))
- {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> json;
- }
- </span><span style="color: #008000;">//</span><span style="color: #008000;">单引号换双引号</span>
- <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> (json.Contains(<span style="color: #800000;">"</span><span style="color: #800000;">‘</span><span style="color: #800000;">"</span><span style="color: #000000;">))
- {
- </span><span style="color: #0000ff;">return</span> json.Replace(<span style="color: #800000;">"</span><span style="color: #800000;">‘</span><span style="color: #800000;">"</span>, <span style="color: #800000;">"</span><span style="color: #800000;">\"</span><span style="color: #800000;">"</span><span style="color: #000000;">);
- }
- </span><span style="color: #008000;">//</span><span style="color: #008000;">没引号的加双引号</span>
- <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> (json.Contains(<span style="color: #800000;">"</span><span style="color: #800000;">lng:</span><span style="color: #800000;">"</span><span style="color: #000000;">))
- {
- json </span>= json.Replace(<span style="color: #800000;">"</span><span style="color: #800000;">lat</span><span style="color: #800000;">"</span>, <span style="color: #800000;">"</span><span style="color: #800000;">\"lat\"</span><span style="color: #800000;">"</span>).Replace(<span style="color: #800000;">"</span><span style="color: #800000;">:</span><span style="color: #800000;">"</span>, <span style="color: #800000;">"</span><span style="color: #800000;">:\"</span><span style="color: #800000;">"</span>).Replace(<span style="color: #800000;">"</span><span style="color: #800000;">,lng</span><span style="color: #800000;">"</span>, <span style="color: #800000;">"</span><span style="color: #800000;">\",\"lng\"</span><span style="color: #800000;">"</span>).Replace(<span style="color: #800000;">"</span><span style="color: #800000;">}</span><span style="color: #800000;">"</span>, <span style="color: #800000;">"</span><span style="color: #800000;">\"}</span><span style="color: #800000;">"</span><span style="color: #000000;">);
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> json;
- }
- </span><span style="color: #0000ff;">else</span><span style="color: #000000;">
- {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> json;
- }
- }
- </span><span style="color: #0000ff;">catch</span><span style="color: #000000;">
- {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> str;
- }
- }
- }</span>
1、查看自己建立的c# clr 程序的属性,选中项目设置,确定目标平台与自己所要生成到的数据版本一直,不要一边是sqlserver2008一遍是sqlserver2012,这样是发布不成功的。还有选择SQLCLR,目标框架要在4.0一下,我选用的是3.5.
2、开启数据库服务器配置选项clr enabled
- <span style="color: #008080;">--</span><span style="color: #008080;">-开启所有服务器配置选项</span>
- <span style="color: #0000ff;">EXEC</span> sp_configure N<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">show advanced options</span><span style="color: #ff0000;">‘</span>, N<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">1</span><span style="color: #ff0000;">‘</span>
- <span style="color: #0000ff;">RECONFIGURE</span> <span style="color: #0000ff;">WITH</span><span style="color: #000000;"> OVERRIDE
- </span><span style="color: #008080;">--</span><span style="color: #008080;">开启clr enabled 选项</span>
- <span style="color: #0000ff;">EXEC</span> sp_configure N<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">clr enabled</span><span style="color: #ff0000;">‘</span>, N<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">1</span><span style="color: #ff0000;">‘</span>
- <span style="color: #0000ff;">RECONFIGURE</span> <span style="color: #0000ff;">WITH</span><span style="color: #000000;"> OVERRIDE
- </span><span style="color: #008080;">--</span><span style="color: #008080;">关闭所有服务器配置选项</span>
- <span style="color: #0000ff;">EXEC</span> sp_configure N<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">show advanced options</span><span style="color: #ff0000;">‘</span>, N<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">0</span><span style="color: #ff0000;">‘</span>
- <span style="color: #0000ff;">RECONFIGURE</span> <span style="color: #0000ff;">WITH</span> OVERRIDE
- --如果存在权限问题,执行下面一段脚本<br><br>alter database [master] set TRUSTWORTHY on<br><br>EXEC sp_changedbowner ‘sa‘
3、发布 sql c# clr 程序集,选择要发布的服务器,与要发布到哪个数据库。确定。
4.配置发布成功
1、找到自己写的sql c# clr 程序集下生成的bin文件夹下的dll文件
2、同样执行上面的脚本,开启数据库服务器配置选项clr enabled,还有给sa付权限的脚本。
3、打开数据库下的可编程性,程序集,新建程序集
4、执行下面注册函数的脚本
- <span style="color: #0000ff;">create</span> <span style="color: #0000ff;">function</span> dbo.ToJson1(<span style="color: #008000;">@patten</span> <span style="color: #ff0000;">[</span><span style="color: #ff0000;">nvarchar</span><span style="color: #ff0000;">]</span>(<span style="color: #800000; font-weight: bold;">4000</span><span style="color: #000000;">))
- </span><span style="color: #0000ff;">RETURNS</span> <span style="color: #0000ff;">nvarchar</span>(<span style="color: #800000; font-weight: bold;">4000</span><span style="color: #000000;">)
- </span><span style="color: #0000ff;">AS</span>
- <span style="color: #008080;">--</span><span style="color: #008080;">-sql c# clr 程序集文件名.类名.方法名</span>
- EXTERNAL NAME BgSqlFun.UserDefinedFunctions.ToJson1
上面2种添加方式,任意一种添加都行。
- <span style="color: #0000ff;">declare</span> <span style="color: #008000;">@points</span> <span style="color: #0000ff;">varchar</span>(<span style="color: #800000; font-weight: bold;">4000</span><span style="color: #000000;">);
- </span><span style="color: #0000ff;">select</span> <span style="color: #008000;">@points</span><span style="color: #808080;">=</span>AreaPoints <span style="color: #0000ff;">from</span> Mp_AreaPositionDetails <span style="color: #0000ff;">where</span> id<span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">672</span>
- <span style="color: #0000ff;">select</span> dbo.ToJson1(<span style="color: #008000;">@points</span>)
就这样做啦一个简单的示例,希望能给一些选手,提供到帮助。thanks。
MSSQLSERVER接入c# clr程序集的使用方法
标签: