小试SQLServer中的CLR特性

本文涉及的产品
云数据库 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
目录
相关文章
|
8月前
|
安全 数据库连接 数据库
WCF服务创建到发布(SqlServer版)
在本示例开始之前,让我们先来了解一下什么是wcf? wcf有哪些特点? wcf是一个面向服务编程的综合分层架构。该架构的项层为服务模型层。 使用户用最少的时间和精力建立自己的软件产品和外界通信的模型。它使得开发者能够建立一个跨平台的安全、可信赖、事务性的解决方案。且能与已有系统兼容写作。 简单概括就是:一组数据通信的应用程序开发接口。
57 0
|
9月前
|
SQL 存储 Oracle
数据库访问和组件技术相关概念(ADO、ActiveX、DLL、ODBC等)详解
数据库访问和组件技术相关概念(ADO、ActiveX、DLL、ODBC等)详解
|
SQL 关系型数据库 数据库
sqlserver中几种典型的等待
为了准备今年的双11很久没有更新blog,在最近的几次sqlserver问题的排查中,总结了sqlserver几种典型的等待类型,类似于oracle中的等待事件,如果看到这样的等待类型时候能够迅速定位问题的根源,下面通过一则案例来把这些典型的等待处理方法整理出来: 第一种等待.memory等待
1665 0
|
Go 数据库 存储
第十七章——配置SQLServer(1)——为SQLServer配置更多的处理器
原文: 第十七章——配置SQLServer(1)——为SQLServer配置更多的处理器 前言:         SQLServer提供了一个系统存储过程,SP_Configure,可以帮助你管理实例级别的配置。
980 0
|
Go 索引 存储
第十七章——配置SQLServer(4)——优化SQLServer实例的配置
原文: 第十七章——配置SQLServer(4)——优化SQLServer实例的配置 前言: Sp_configure 可以用于管理和优化SQLServer资源,而且绝大部分配置都可以使用SQLServer ManagementStudio的图形化界面实现。
956 0
|
SQL 监控 数据库
SQLServer 扫盲
原文: SQLServer 扫盲   谨以本文记录本人成长历程,并分享给各位SQL Server数据库管理系统使用者。本系列包含个人认为一个DBA应该具有的各项素质,系列文章将以下面列表展示,将持续更新,敬请留意及指导,谢谢。
1335 0
|
SQL 测试技术 数据库
解剖SQLSERVER 第十一篇 对SQLSERVER的多个版本进行自动化测试(译)
原文:解剖SQLSERVER 第十一篇 对SQLSERVER的多个版本进行自动化测试(译) 解剖SQLSERVER 第十一篇    对SQLSERVER的多个版本进行自动化测试(译) http://improve.dk/automated-testing-of-orcamdf-against-multiple-sql-server-versions/ 自从我发布了OrcaMDF Studio,我已经意识到SQL2005和SQL2008之间的一些系统表的差异。
1252 0

相关实验场景

更多