2014-06-19 16:06 by 假面Wilson, 2144 阅读, 0 评论, 收藏, 编辑

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);                elsematch = 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函数一样:

 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…以免出现异常。

转载于:https://blog.51cto.com/wwdyl/1733903

SQL Server中使用正则表达式相关推荐

  1. SQL Server中执行正则表达式

    总体方案:写function,再执行update语句. 一.查询函数 -- ============================================= -- Author: <l ...

  2. 在sql server中用正则表达式替换html标签,SQL Server中利用正则表达式替换字符串

    建立正则替换函数,利用了OLE对象,以下是函数代码: --如果存在则删除原有函数 IF OBJECT_ID(N'dbo.RegexReplace') IS NOT NULL DROP FUNCTION ...

  3. SQL Server中的CLR编程——用.NET为SQL Server编写存储过程和函数

    很早就知道可以用.NET为SQL Server2005及以上版本编写存储过程.触发器和存储过程的,不过之前开发的系统要么因为历史原因用的是SQL2000要么根本用不着在SQL Server中启用CLR ...

  4. SQL server 中SQL语句实战操作

    学习网址链接: https://www.w3school.com.cn/sql/sql_top.asp 学习案例链接: https://wenku.baidu.com/view/720053b459f ...

  5. SQL Server中的T-SQL RegEx命令

    This article explores T-SQL RegEx commands in SQL Server for performing data search using various co ...

  6. php删除sql server 2008,MSSQL_SQL Server2008 数据库误删除数据的恢复方法分享,SQL Server中误删除数据的恢复本 - phpStudy...

    SQL Server2008 数据库误删除数据的恢复方法分享 SQL Server中误删除数据的恢复本来不是件难事,从事务日志恢复即可.但是,这个恢复需要有两个前提条件: 1. 至少有一个误删除之前的 ...

  7. SQL Server中Identity标识列

    SQL Server中,经常会用到Identity标识列,这种自增长的字段操作起来的确是比较方便.但它有时还会带来一些麻烦. SQL Server中,经常会用到Identity标识列,这种自增长的字段 ...

  8. predicate 列存储索引扫描_在SQL SERVER中导致索引查找变成索引扫描的问题分析

    SQL Server 中什么情况会导致其执行计划从索引查找(Index Seek)变成索引扫描(Index Scan)呢? 下面从几个方面结合上下文具体场景做了下测试.总结.归纳. 1:隐式转换会导致 ...

  9. mysql2008 limit,在SQL Server中实现 Limit m, n 的功能

    在SQL Server中实现 Limit m, n 的功能 (2012-03-14 18:17:43) 标签: 杂谈 在MySQL中,可以用 Limit 来查询第 m 列到第 n列的记录,例如: se ...

最新文章

  1. xp/2003开关3389指令
  2. Lua bind 和 conf 实现
  3. 刻意练习:Python基础 -- Task12. 模块
  4. xftp6设置默认打开文件的程序_xftp6如何使用?xftp6传输文件的使用详细方法--系统之家...
  5. windows系统托盘tray
  6. python处理excel表格-Python读写Excel表格(简单实用)
  7. WP布局难题,由三个升级为四个
  8. arcmap中有火星坐标码_GIS转换之火星坐标系转换
  9. winSCP start
  10. 移动端web及app设计尺寸
  11. 微信朋友圈python广告评论_利用Python让你的微信朋友圈与众不同,更加高大上
  12. vue-pdf vue中导入文件 并预览
  13. 产品经理入门:二、一个需求的奋斗史
  14. HC-SR501 人体红外感应模块 单片机
  15. 任务二:移动通信发展史
  16. 2022-2028年中国智慧社区建设行业市场专项调研及投资前景研究报告
  17. 企业微信机器人发送消息
  18. axis=0 与 axis=1 的区分
  19. 最新!2023年工程测量乙级测绘资质申请标准
  20. 【李叫兽】如何识别故作高深的空话

热门文章

  1. RSocket:又一个REST的挑战者
  2. nf_conntrack: table full, dropping packet 解决方案
  3. Python笔记6(异常)-20160924
  4. SHELL判断服务是不是正在运行
  5. 在tomcat下创建和发布WEB应用
  6. 静态路由中使用一跳和出接口的区别
  7. centos升级glibc动态库
  8. Python: 没有switch-case语句
  9. (原)linux下caffe模型转tensorflow模型
  10. hihoCoder挑战赛29