导航
  • 全部
...

【交流】SQL2005CLR函数扩展-正则表达式

jinjazz 2009-04-22 10:21:30
加精
blog地址,欢迎大家访问我的博客。
http://blog.csdn.net/jinjazz/archive/2009/04/22/4101746.aspx



用过Oracle的人都知道Oracle有四个正则表达函数REGEXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR、和 EGEXP_REPLACE,而SQLServer却无法完全实现上面的功能。以前我们知道用sp_OAxxx系列函数来调用js组建实现正则,现在我们可以通过CLR扩展来借助.Net实现。

※代码很简单,就是封装一下System.Text.RegularExpressions.Regex到SQLProject当中。我们可以用下面15行代码完成上述的四个函数中的最常用的两个REGEXP_LIKE和EGEXP_REPLACE。

  1. using System;
  2. using System.Data.SqlTypes;
  3. public partial class RegExp
  4. {
  5. [Microsoft.SqlServer.Server.SqlFunction]
  6. public static SqlBoolean RegExp_Like(SqlString input,SqlString pattern)
  7. {
  8. if (input.IsNull || pattern.IsNull) return false;
  9. return System.Text.RegularExpressions.Regex.IsMatch(input.Value, pattern.Value);
  10. }
  11. [Microsoft.SqlServer.Server.SqlFunction]
  12. public static SqlString RegExp_Replace(SqlString input,SqlString pattern,SqlString replacement)
  13. {
  14. if (input.IsNull || pattern.IsNull || replacement.IsNull) return input;
  15. return new System.Text.RegularExpressions.Regex(pattern.Value).Replace(input.Value, replacement.Value);
  16. }
  17. };



※把上述的代码编译为SQLCLR_RegExp.dll,然后找一台服务器发布,我们这里发布到测试数据库sqlclr中。发布代码如下,比较简单,我就不写注释了,大致流程就是启用clr然后注册assembly,最后申明函数。

  1. create database sqlclr
  2. go
  3. use sqlclr
  4. go
  5. exec sp_configure 'clr enabled', '1'
  6. go
  7. reconfigure;
  8. exec sp_configure 'show advanced options', '1';
  9. go

  10. ALTER DATABASE sqlclr SET TRUSTWORTHY On
  11. go
  12. CREATE ASSEMBLY SqlClr_RegEx FROM 'E:\sqlclrdata\SQLCLR_RegExp.dll' WITH PERMISSION_SET = UnSAFE;
  13. --
  14. go
  15. CREATE FUNCTION dbo.ufn_RegExp_Like
  16. (
  17. @input nvarchar(max),
  18. @pattern nvarchar(4000)
  19. )
  20. RETURNS bit
  21. AS EXTERNAL NAME SqlClr_RegEx.RegExp.RegExp_Like

  22. go
  23. CREATE FUNCTION dbo.ufn_RegExp_Replace
  24. (
  25. @input nvarchar(max),
  26. @pattern nvarchar(4000),
  27. @replacement nvarchar(4000)
  28. )
  29. RETURNS nvarchar(max)
  30. AS EXTERNAL NAME SqlClr_RegEx.RegExp.RegExp_Replace


※这样我们就有两个处理正则表达式的函数ufn_RegExp_Like和ufn_RegExp_Replace ,下面做一些测试,比如邮箱格式的检查和数字的替换。

  1. set nocount on
  2. declare @t table(teststring varchar(50))
  3. insert into @t select '上海市南京路100号2弄3号'
  4. insert into @t select 'jinjazz@sina.com.cn'
  5. insert into @t select '剪刀@msn.com'
  6. insert into @t select 'fdf98s'

  7. --获取合法邮箱
  8. select * from @t
  9. where dbo.ufn_RegExp_Like(teststring,'\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*')>0
  10. /*
  11. teststring
  12. --------------------------------------------------
  13. jinjazz@sina.com.cn
  14. 剪刀@msn.com
  15. */


  16. --替换数字
  17. select dbo.ufn_RegExp_Replace(teststring,'[\d*$]','*') as newstring from @t
  18. /*
  19. newstring
  20. -------------------------------------------------
  21. 上海市南京路***号*弄*号
  22. jinjazz@sina.com.cn
  23. 剪刀@msn.com
  24. fdf**s
  25. */

  26. set nocount off

...全文
给本帖投票
1400 60 打赏 收藏 转发到动态 举报
写回复
用AI写文章
60 条回复
切换为时间正序
请发表友善的回复…
发表回复
cailee 2010-08-12
  • 打赏
  • 举报
回复
mark 掘坟
mingyicz 2009-06-13
  • 打赏
  • 举报
回复
mark
jcno1 2009-04-28
  • 打赏
  • 举报
回复
学习一下
bhtfg538 2009-04-28
  • 打赏
  • 举报
回复
没有IDE,稍微修改下

[Microsoft.SqlServer.Server.SqlFunction]
public static SqlBoolean RegExp_Like(SqlString input,SqlString pattern)
{

try
{
if (string.IsNullOrEmpty(input) || string.IsNullOrEmpty(pattern)) return false;
Regex reg = new Regex(pattern, RegexOptions.Compiled);
return reg.IsMatch(input);
}
catch (ArgumentException ex)
{
return false;
}
catch (Exception ex)
{
return false;
}

}
bhtfg538 2009-04-28
  • 打赏
  • 举报
回复
说一句,LZ 完全没有考虑 正则异常的问题
比如 我 的括号不匹配 怎么办?(.*( 这样的正则 你怎么弄的,很明显 try
以后要返回一个false


使用这个 ,必须考虑 各种情况,
LZ 很热心,不过使用 各种东西的是要要考虑墨菲法则

技术风险能够由可能性变为突发性的事实
qgylovelj 2009-04-28
  • 打赏
  • 举报
回复
up
claro 2009-04-28
  • 打赏
  • 举报
回复
/*一直有个疑问,CSDN数据库版的高手都是负责开发吗?
70%的问题都涉及语句构造和重造,15%的问题是单机数据库故障疑问,5%的问题是服务器数据库故障,
10%才是DBA需要做的事情。
渐渐感觉在MSSQL平台上,DBA主要做开发?
*/
shimenghui 2009-04-27
  • 打赏
  • 举报
回复
谢谢了。 沙发
pwx1983 2009-04-27
  • 打赏
  • 举报
回复
学习
fescort 2009-04-27
  • 打赏
  • 举报
回复
学习
zhangle861010 2009-04-27
  • 打赏
  • 举报
回复
学习!
ycg_893 2009-04-27
  • 打赏
  • 举报
回复
不错
gahyyai 2009-04-27
  • 打赏
  • 举报
回复
学习中……
walnut2800 2009-04-27
  • 打赏
  • 举报
回复
学习
我为鱼肉 2009-04-27
  • 打赏
  • 举报
回复
还没学,不懂。。。学习。。。
chenminde09 2009-04-27
  • 打赏
  • 举报
回复
学习了
playwarcraft 2009-04-25
  • 打赏
  • 举报
回复
先mark
pelasido 2009-04-25
  • 打赏
  • 举报
回复
regex
wanshichen 2009-04-25
  • 打赏
  • 举报
回复
收藏~
十八道胡同 2009-04-25
  • 打赏
  • 举报
回复
谢谢分享,
加载更多回复(37)

34,836

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧

手机看
关注公众号

关注公众号

客服 返回
顶部