小试SQLServer中的CLR特性

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介: 维基百科中对SQL CLR的定义: SQL CLR (SQL Common Language Runtime) 是自 SQL Server 2005 才出现的新功能,它将.NET Framework中的CLR服务注入到 SQL Server 中,让 SQL Server 的部份数据库对象可以使用 .NET Framework 的编程语言开发(目前只支持VB.NET和C#),包括预存程序、用户自定义函数、触发程序、用户自定义类型以及用户自定义汇总函数等功能。

维基百科中对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


宠辱不惊,看庭前花开花落;去留无意,望天上云卷云舒
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
存储 SQL .NET
SQL Server 2012 T-SQL 新特性
原文:SQL Server 2012 T-SQL 新特性 序列 Sequence SQL Server 现在将序列当成一个对象来实现,创建一个序列的例子语法如下: CREATE SEQUENCE DemoSequence START WITH 1 INCREMENT BY 1; 使用序列的方法如下所表达的: SELECT VALUE FOR DemoSequence 序列与以前的种子列(identity)的区别很明显,种子列只限于当前列,而序列是一个对象层面的实现,则可以在多个表之间共享。
1114 0
|
SQL 算法 数据库
小心SQL SERVER 2014新特性&mdash;&mdash;基数评估引起一些性能问题
原文:小心SQL SERVER 2014新特性——基数评估引起一些性能问题     在前阵子写的一篇博文“SQL SERVER 2014 下IF EXITS 居然引起执行计划变更的案例分享”里介绍了数据库从SQL SERVER 2005升级到 SQL SERVER 2014后,发现一个SQL出现性能问题,当时分析后发现执行计划变了,导致SQL出现了性能问题。
1138 0
|
SQL 存储
SQL Server 2016新特性:DROP IF EXISTS
原文:SQL Server 2016新特性:DROP IF EXISTS  在我们写T-SQL要删除某个对象(表、存储过程等)时,一般会习惯先用IF语句判断该对象是否存在,然后DROP,比如: 旧版本: IF OBJECT_ID('dbo.
1393 0
下一篇
无影云桌面