小试SQLServer中的CLR特性

维基百科中对SQL CLR的定义:

SQL CLR (SQL Common Language Runtime) 是自 SQL Server 2005 才出现的新功能,它将.NET Framework中的CLR服务注入到 SQL Server 中,让 SQL Server 的部份数据库对象可以使用 .NET Framework 的编程语言开发(目前只支持VB.NETC#),包括预存程序用户自定义函数触发程序用户自定义类型以及用户自定义汇总函数等功能。

在苦于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

posted @ 2012-11-15 16:32  网无忌  阅读(541)  评论(0编辑  收藏  举报