SQL Server 2005: 正则表达式使模式匹配和数据提取变得更容易
2009-02-10 10:20:07 来源:WEB开发网Figure3匹配的表值 CLR UDF
[SqlFunction( FillRowMethodName = "FillMatchRow",
TableDefinition = "[Index] int,[Text] nvarchar(max)" )]
public static IEnumerable RegexMatches(SqlChars input, SqlString pattern)
{
return new MatchIterator( new string( input.Value ), pattern.Value );
}
[SuppressMessage( "Microsoft.Design", "CA1021:AvoidOutParameters" )]
public static void FillMatchRow( object data,
out SqlInt32 index, out SqlChars text )
{
MatchNode node = (MatchNode)data;
index = new SqlInt32( node.Index );
text = new SqlChars( node.Value.ToCharArray( ) );
}
对于 MatchIterator 的每个迭代,MatchNode 将被作为第一个参数传递到 FillMatchRow 方法。FillMatchRow 方法的其余参数必须声明为输出参数而且必须与第一个函数中定义的表定义匹配。FillMatchRow 函数仅使用 MatchNode 属性来填充字段数据。
最后,您可通过此函数从字符串轻松地提取多个数据片段。为了说明对 RegexMatches 函数的应用,让我们处理一个字符串以便使用此查询来确定其中包含多少个不同的单词:
declare @text nvarchar(max), @pattern nvarchar(max)
select
@text = N'Here are four words.',
@pattern = 'w+'
select count(distinct [Text])
from dbo.RegexMatches( @text, @pattern )
此示例非常简单。不过它通过删除不同的关键字来显示使用此函数的某些可能性并且返回字符串的总字数。许多网站的文本输入限制似乎为任意长度的字符串。通过将此类测试与新的 nvarchar(max) 表示法相结合,它可以限制输入字数。此类查询可用于满足各种分析处理需求,而 RegexMatches 函数还可用于执行常见的任务。遗憾的是,此类查询还体现出对于使用正则表达式的过度热衷。此例中通过“w+”表达式完成的拆分操作可以恰好通过 String.Split 方法轻松地完成,那样速度会更快。正则表达式是一个非常强大的工具,但一定要确保有充分理由应用它们。可能存在用于特定情况的更简单且性能更佳的工具。
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››Sql server 2005拒绝了对对象 'xx表' (数...
更多精彩
赞助商链接