T-SQL 正则表达式(CLR 实现)

  正则表达式在处理字符串方面有其特殊的优势,但是 T-SQL 至今没有支持(遗憾)。不过可以通过 CLR 函数"曲线救国"。
  闲话不说,开工(需要 SQL Server 2005 及以上版本)。
  编写程序集(ClrRegExClass.cs)
  using System;
  using System.Data;
  using System.Data.SqlClient;
  using System.Data.SqlTypes;
  using Microsoft.SqlServer.Server;
  using System.Text.RegularExpressions;
  publicpartialclass RegExp
  {
  // 验证字符串中是否包含与指定的匹配模式一致的字符串
  [SqlFunction(IsDeterministic = true, IsPrecise = true)]
  publicstatic SqlBoolean RegExIsMatch(SqlString expression, SqlString pattern)
  {
  returnnew SqlBoolean(Regex.IsMatch(expression.ToString(), pattern.ToString()));
  }
  // 替换字符串中与指定的匹配模式一致的字符串
  [SqlFunction(IsDeterministic = true, IsPrecise = true)]
  publicstatic SqlString RegExReplace(SqlString expression, SqlString pattern, SqlString replacement)
  {
  returnnew SqlString(Regex.Replace(expression.ToString(), pattern.ToString(),replacement.ToString()));
  }
  // 提取字符串中与指定的匹配模式一致的字符串
  [SqlFunction(IsDeterministic = true, IsPrecise = true)]
  publicstatic SqlString RegExSubstring(SqlString expression, SqlString pattern, SqlInt32 position, SqlInt32 occurrence)
  {
  if (expression.ToString().Length 正则表达式;
  // @position 为字符串开始的位置;@occurrence 为与指定的匹配模式一致的字符串出现的次数
  ifobject_id('dbo.regex_ismatch','FS') isnotnull
  dropfunction dbo.regex_ismatch;
  go
  createfunction dbo.regex_ismatch
  (@expressionnvarchar(max), @patternnvarchar(max))
  returnsbitwithreturnsnullonnull input
  as external name RegExp.RegExp.RegExIsMatch;
  go
  -- 验证字符串是否以 [server] 开头
  -- select dbo.regex_ismatch('[server].[database].[schema].[o bject]','^\[server\]');
  ifobject_id('dbo.regex_replace','FS') isnotnull
  dropfunction dbo.regex_replace;
  go
  createfunction dbo.regex_replace
  (@expressionnvarchar(max), @patternnvarchar(max), @replacementnvarchar(max))
  returnsnvarchar(max) withreturnsnullonnull input
  as external name RegExp.RegExp.RegExReplace;
  go
  -- 将字符串中 [...] 替换为 "..."
  -- select dbo.regex_replace('[server].[database].[schema].[o bject]','\[([\w]*)\]','"$1"');
  ifobject_id('dbo.regex_substring','FS') isnotnull
  dropfunction dbo.regex_substring;
  go
  createfunction dbo.regex_substring
  (@expressionnvarchar(max), @patternnvarchar(max), @positionint, @occurrenceint)
  returnsnvarchar(max) withreturnsnullonnull input
  as external name RegExp.RegExp.RegExSubstring;
  go
  -- 提取字符串中与 [...] 模式匹配的第二次出现的字符串
  -- select dbo.regex_substring('[server].[database].[schema]. [object]','\[\w*\]',1,2); ifobject_id('dbo.regex_count','FS') isnotnull dropfunction dbo.regex_count; go createfunction dbo.regex_count (@expressionnvarchar(max), @patternnvarchar(max), @positionint) returnsintwithreturnsnullonnull input as external name RegExp.RegExp.RegExCount; go -- 计算字符串中与 [...] 模式匹配的字符串的数目
  -- select dbo.regex_count('[server].[database].[schema].[object]','\[\w*\]',1);
  ifobject_id('dbo.regex_index','FS') isnotnull
  dropfunction dbo.regex_index;
  go
  createfunction dbo.regex_index
  (@expressionnvarchar(max), @patternnvarchar(max), @positionint, @occurrenceint)
  returnsintwithreturnsnullonnull input
  as external name RegExp.RegExp.RegExIndex;
  go
  -- 查询字符串中与 [...] 模式匹配的第二次出现的字符串开始的位置
  -- select dbo.regex_index('[server].[database].[schema].[obj ect]','\[\w*\]',1,2);
  完成。
  遗憾的是,这些 T-SQL 函数不能像 SQL Server 内置的系统函数一样在任何数据库下直接通过函数名调用。
  可选的方法,将这些函数存储在 MASTER 数据库中,再在用户数据库下创建这些函数的同以词以方便调用(有点麻烦)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值