Advertisement

sql server使用正则表达式

阅读量:
目标

为数据库开发一个正则表达式函数作为查询辅助工具
不推荐使用函数类解决方案,因为对于内存中的问题可以直接通过代码解决的情况来说,采用代码直接处理更为高效
此方法仅供参考性质

操作
  1. 创建一个sql server项目
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BmEHyF1U-1607503197771)(https://user-images.githubusercontent.com/19277908/44075424-55e5e8be-9fcf-11e8-8f77-f48b7686499e.png)]
  2. 制定规则模式识别方法
复制代码
    public class 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;
    }
    }
  1. 配置相关数据库信息
    通过右键属性设置连接字符串,并支持添加多个连接
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    指定数据库版本
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
  2. 通过右键选择发布选项
    完成相关操作后即可完成部署流程。
4
使用
复制代码
    --注意N不能遗漏  
    --注意sql里面的"true","false"对应1,0
    where dbo.RegexMatch(table.property,N'"title":"[^"]*搜索内容[^"]*"',1)=1    
注意事项

发布报错信息显示:在尝试执行 CREATE ASSEMBLY 运行时出现错误,请检查相关设置以确保项目兼容性。
由于该程序集被创建为公共语言环境下的不可用版本,在SQL SERVER 2008R2环境下无法直接使用.net4.0框架。建议将项目转换至.net3.5框架重新部署即可解决问题。
在运行时环境配置中设置完成后未成功生成可执行文件,请检查配置参数是否正确。

当尝试运行SQL时会遇到错误:在.NET Framework中不被允许运行用户代码的SQL语句。要启用‘clr enabled’配置设置以解决此问题。通过启用‘clr enabled’配置设置来解决此问题。

复制代码
    exec sp_configure 'show advanced options', '1';
    go
    reconfigure;
    go
    exec sp_configure 'clr enabled', '1'
    go
    reconfigure;
    exec sp_configure 'show advanced options', '1';
    go

参考文献:不建议在 .NET Framework 中直接执行用户代码;可以通过启用 clr enabled 设置项来模拟类似的行为

参考资料

如何实现SQL Server 对组件 ‘Ole Automation Procedures’ 的 过程’sys.sp_OACreate’ 访问的禁止措施?
SQL Server环境下如何应用正则表达式进行数据处理?
请指导如何在VS2013环境中配置并运行SQLServer项目的相关步骤?

其他——PATINDEX
复制代码
    where PATINDEX(N'%搜索内容%', table.property)>=1

这里采用了通配符来进行字符串的比较操作。PATINDEX (Transact-SQL)该函数用于获取字符串中特定子串的位置信息。它会返回匹配的位置序号值;若未找到对应字符,则返回值为零。当位置序号大于等于一时,则表示该子串确实存在于原始字符串中

全部评论 (0)

还没有任何评论哟~