维基百科中对SQL CLR的定义:
SQL CLR (SQL Common Language Runtime) 是自 SQL Server 2005 才出现的新功能,它将.NET Framework中的CLR服务注入到 SQL Server 中,让 SQL Server 的部份数据库对象可以使用 .NET Framework 的编程语言开发(目前只支持VB.NET和C#),包括预存程序、用户自定义函数、触发程序、用户自定义类型以及用户自定义汇总函数等功能。
在苦于T-SQL无法使用正则时,通过BAIDU认识了CLR,索性小试一番
果然很给力,现在把过程回忆一下:
1、启动VS2010,新建SQL Server项目,填写数据库服务器的连接信息,编写完成的函数也将部属到这个数据库上,以后可以在项目属性中进行更改。
2、新建一个“用户自定义函数”,名称:RegexHelper
3、在RegexHelper类中添加两个方法:
[Microsoft.SqlServer.Server.SqlFunction] /// <summary> /// 是否匹配正则表达式 /// </summary> /// <param name="input">输入的字符串</param> /// <param name="pattern">正则表达式</param> /// <param name="ignoreCase">是否忽略大小写</param> /// <returns></returns> public static bool RegexTest(string input, string pattern, bool ignoreCase) { bool isMatch = false; if (!string.IsNullOrEmpty(input) && !string.IsNullOrEmpty(pattern)) { try { Match match = null; if (ignoreCase) match = Regex.Match(input, pattern, RegexOptions.Multiline | RegexOptions.IgnoreCase | RegexOptions.Compiled); else match = Regex.Match(input, pattern, RegexOptions.Multiline | RegexOptions.Compiled); if (match.Success) isMatch = true; } catch { } } return isMatch; } /// <summary> /// 获取正则表达式分组中的字符 /// </summary> /// <param name="input">输入的字符串</param> /// <param name="pattern">正则表达式</param> /// <param name="groupId">分组的位置</param> /// <param name="maxReturnLength">返回字符的最大长度</param> /// <returns></returns> public static string RegexMatch(string input, string pattern, int groupId, int maxReturnLength) { string strReturn = string.Empty; if (!string.IsNullOrEmpty(input) && !string.IsNullOrEmpty(pattern)) { try { Match match = Regex.Match(input, pattern, RegexOptions.Multiline | RegexOptions.IgnoreCase | RegexOptions.Compiled); if (match.Success && (groupId < match.Groups.Count)) { strReturn = match.Groups[groupId].Value; strReturn = (strReturn.Length <= maxReturnLength) ? strReturn : strReturn.Substring(0, maxReturnLength); } } catch { return string.Empty; } } return strReturn; }
4、保存,右键项目属性,选择“部属”。
5、错误提示: 'EXTERNAL' 附近有语法错误。您可能需要将当前数据库的兼容级别设置为更高的值
问题原因:数据库的兼容级别过低
解决办法:打开MS SQL Management Studio,选择数据库,属性,选项,兼容级别,选择2005以上
6、终于部属成功啦!可以数据库的标量值函数中看到上面的两个函数
7、打开数据库的查询分析器,测试结果:
select dbo.RegexTest('a1234567','^a\d+$','true')
select dbo.RegexTest('a1234567','^\d+$','true')
出现错误:禁止在 .NET Framework 中执行用户代码。启用 "clr enabled" 配置选项。
解决办法:运行以下语句:
exec sp_configure 'clr enabled',1; go reconfigure with override; go
再次执行测试语句,结果:
1
0
大功告成
时间有限,等以后有机会再深入学习!
感谢Eric Kong的BLOG!
附上以上两个CLR函数的分发部署脚本:SQL_CLR_Regex.zip
宠辱不惊,看庭前花开花落;去留无意,望天上云卷云舒