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

SQL Server中使用正则表达式的更多相关文章

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

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

  2. 在Sql Server 中使用正则表达式

    CREATE FUNCTION dbo.find_regular_expression ( ), --需要匹配的源字符串 ), --正则表达式 --是否区分大小写,默认为false ) RETURNS ...

  3. SQL Server中利用正则表达式替换字符串

    --如果存在则删除原有函数  IF OBJECT_ID(N'dbo.RegexReplace') IS NOT NULL       DROP FUNCTION dbo.RegexReplace  G ...

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

    原文:SQL Server中的CLR编程--用.NET为SQL Server编写存储过程和函数 很早就知道可以用.NET为SQL Server2005及以上版本编写存储过程.触发器和存储过程的,不过之 ...

  5. SQL Server中生成测试数据

    原文:SQL Server中生成测试数据 简介      在实际的开发过程中.很多情况下我们都需要在数据库中插入大量测试数据来对程序的功能进行测试.而生成的测试数据往往需要符合特定规则.虽然可以自己写 ...

  6. SQL Server中的高可用性(2)----文件与文件组

        在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...

  7. SQL Server中SELECT会真的阻塞SELECT吗?

    在SQL Server中,我们知道一个SELECT语句执行过程中只会申请一些意向共享锁(IS) 与共享锁(S), 例如我使用SQL Profile跟踪会话86执行SELECT * FROM dbo.T ...

  8. Microsoft SQL Server中的事务与并发详解

    本篇索引: 1.事务 2.锁定和阻塞 3.隔离级别 4.死锁 一.事务 1.1 事务的概念 事务是作为单个工作单元而执行的一系列操作,比如查询和修改数据等. 事务是数据库并发控制的基本单位,一条或者一 ...

  9. SQL Server中TOP子句可能导致的问题以及解决办法

    简介      在SQL Server中,针对复杂查询使用TOP子句可能会出现对性能的影响,这种影响可能是好的影响,也可能是坏的影响,针对不同的情况有不同的可能性.      关系数据库中SQL语句只 ...

随机推荐

  1. 自定义view实现侧滑菜单

    自定义View public class SlidingMenu extends HorizontalScrollView { private int mScreenWidth; private in ...

  2. Redis安装及初步使用

    一.Centos下安装Redis1.wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm2.rp ...

  3. Visual Studio 2008破解激活升级方法

    声明:本文中涉及到的序列号及更新方法均来自互联网,请支持正版. 微软为业余爱好者.热衷者和学生提供了免费版——Express Edition (轻型.易学.易用的开发工具). 如不想支付任何费用,建议 ...

  4. 浮动以后父DIV包不住子DIV解决方案

    转载自http://blog.sina.com.cn/s/blog_6c363acf0100v4cz.html 当DIV1里面嵌套有一个DIV2,当DIV2设置了浮动,那么DIV1是无法被撑开的,也就 ...

  5. java ObjectOutputStream

    import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import ...

  6. Merge用法

    Merge用来从一个表中选择一些数据更新或者插入到另一个表中.而最终是用更新还是用插入的方式取决于该语句中的条件. 下面我们简单的举一个例子:   SQL> create table merge ...

  7. Python之 continue继续循环和多重循环

    Python之 continue继续循环 在循环过程中,可以用break退出当前循环,还可以用continue跳过后续循环代码,继续下一次循环. 假设我们已经写好了利用for循环计算平均分的代码: L ...

  8. jquery全选+下拉+单选+事件+挂事件

    1.全选 <body> <input type="checkbox" id="qx" /> 全选 <input type=&quo ...

  9. USBDongle及Btool使用说明

    BLE 模块可使用开发套件中的 USB Dongle 模拟手机APP配合Btool.exe 进行蓝牙通讯测试. >连接 BLE 模块 USB Dongle 和模块的连接是通讯的基础,扫描连接的操 ...

  10. json 增删改 加 排序

    <script type="text/javascript"> var json = { "age":24, "name":&q ...