zoukankan      html  css  js  c++  java
  • SQL Server中使用正则表达式

    SQL Server 2005及以上版本支持用CLR语言(C# .NET、VB.NET)编写过程、触发器和函数,因此使得正则匹配,数据提取能够在SQL中灵活运用,大大提高了SQL处理字符串,文本等内容的灵活性及高效性。

    操作步骤:

    1.新建一个SQL Server项目(输入用户名,密码,选择DB),新建好后,可以在属性中更改的

    2.新建一个类“RegexMatch.cs”,选择用户定义的函数

    可以看到,该类为一个部分类:public partial class UserDefinedFunctions

    现在可以在该类中写方法了,注意方法的属性为:[Microsoft.SqlServer.Server.SqlFunction]

    现在类中增加以下两个方法:

    /// 是否匹配正则表达式
        /// </summary>
        /// <param name="input">输入的字符串</param>
        /// <param name="pattern">正则表达式</param>
        /// <param name="ignoreCase">是否忽略大小写</param>
        /// <returns></returns>
        [Microsoft.SqlServer.Server.SqlFunction]
        public static bool RegexMatch(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>
        /// <param name="input">输入的字符串</param>
        /// <param name="pattern">正则表达式</param>
        /// <param name="groupId">分组的位置</param>
        /// <param name="maxReturnLength">返回字符的最大长度</param>
        /// <returns></returns>
        [Microsoft.SqlServer.Server.SqlFunction]
        public static string GetRegexMatchGroups(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;
        }

    3.下一步就是部署的问题了,点击项目右键--》部署即可

    提示部署成功了,可以在数据库的标量值函数中多了这两个方法了。

    使用方法和正常的SQL函数一样:

    select dbo.RegexMatch('/Book/103.aspx','/book/(d+).aspx','true')
    消息 6263,级别 16,状态 1,第 1 行
    禁止在 .NET Framework 中执行用户代码。启用 "clr enabled" 配置选项。

    ——出现此错误,配置下:

    exec sp_configure 'clr enabled',1;
    reconfigure with override;

    是否匹配:

    select dbo.RegexMatch('/Book/103.aspx','/book/(d+).aspx',1)

    返回1,表示匹配成功

    select dbo.RegexMatch('/Book/103.aspx','/book/(d+).aspx',0)

    表示0,匹配失败(不忽略大小写)。

    数据提取:

    select dbo.GetRegexMatchGroups('/Book/103.aspx','/book/(d+).aspx',1,50)

    返回103,非常方便的提取。


    注意:SQL中使用CLR时,尽量使用try catch…以免出现异常。

  • 相关阅读:
    使用 Spring data redis 结合 Spring cache 缓存数据配置
    Spring Web Flow 笔记
    Linux 定时实行一次任务命令
    css js 优化工具
    arch Failed to load module "intel"
    go 冒泡排序
    go (break goto continue)
    VirtualBox,Kernel driver not installed (rc=-1908)
    go运算符
    go iota
  • 原文地址:https://www.cnblogs.com/colder/p/3796864.html
Copyright © 2011-2022 走看看