SQL Server 2005: 正则表达式使模式匹配和数据提取变得更容易
2009-02-10 10:20:07 来源:WEB开发网CLR 用户定义函数
CLR 用户定义函数只是在 .NET 程序集中定义的静态方法(Visual Basic 中的共享函数)。要使用 SQLCLR 对象,您必须使用新的 CREATE ASSEMBLY 语句在 SQL Server 注册程序集,然后在程序集中创建指向其实现的各个对象。对函数而言,CREATE FUNCTION 语句已扩展为支持创建 CLR 用户定义函数。为了简化操作,使用 SQL Server Project 时,Visual Studio® 2005 将代表您处理所有注册过程。此类项目与多数 Visual Studio 项目不同,因为当您尝试调试(或启动而未调试)时,项目将被重新编译,生成的程序集以及其中定义的所有 SQLCLR 对象将随后部署到 SQL Server,然后注册到 SQL Server。然后,IDE 将运行为项目指定的测试脚本。可以在 SQL 脚本和您的 .NET 代码中设置断点,这样可以简化调试过程。
添加函数就像将新类添加到任何其他项目类型一样。仅将一个新项添加到项目并且在提示时选择“用户定义函数”。新方法则被添加到包含所有函数的局部类。新方法还将有一个适用它的 SqlFunction 属性。Visual Studio 使用此属性来创建注册函数所需的 SQL 语句。SqlFunction 中的 IsDeterministic、IsPrecise、DataAccess 和 SystemDataAccess 字段也由 SQL Server 用于各种用途。
模式匹配
确定字符串是否与模式匹配是对正则表达式的最简单应用,如图 1 所示,而且易于操作。
Figure1字符串匹配
public static partial class UserDefinedFunctions
{
public static readonly RegexOptions Options =
RegexOptions.IgnorePatternWhitespace |
RegexOptions.Singleline;
[SqlFunction]
public static SqlBoolean RegexMatch(
SqlChars input, SqlString pattern)
{
Regex regex = new Regex( pattern.Value, Options );
return regex.IsMatch( new string( input.Value ) );
}
}
首先,我使用“选项”字段来存储函数的正则表达式选项。在此情况下,我选择了 RegexOptions.SingleLine 和 RegexOptions.IgnorePatternWhitespace。前者指定单行模式,而后者则从正则表达式消除保留的空格并且启用由磅符号标记的注释。仔细考虑和分析后,您可能想要使用的另一个选项是 RegexOption.Compiled。如果将 Compiled 用于大量使用的表达式,只要选项不是太多,您会发现显著的性能改进。反复使用的表达式应明确编译。然而,对于很少使用的正则表达式,则不要使用 Compiled,否则会增加启动成本和内存开销。同样,您可能想要通过指定您是否想要编译表达式的其他参数来增强通用的 RegexMatch 函数;这样,您可以根据具体情况确定花费额外开销而带来的性能改进是否值得。
更多精彩
赞助商链接