在数据库管理中,字符串处理是一项常见的任务。SQL Server提供了一些基本的字符串处理函数,如CHARINDEX、PATINDEX、SUBSTRING、STUFF和REPLACE等。然而,这些函数在处理复杂的字符串模式时可能会显得力不从心。正则表达式提供了一种强大而灵活的方式来匹配字符串模式,可以极大地简化这些任务。
xp_regex是一个为SQL Server2000编写的扩展存储过程,它允许直接在T-SQL中使用正则表达式。这个扩展存储过程是用托管C++编写的,如果担心非.NET代码(在这个例子中是SQL Server)和.NET代码在同一进程中混合使用时的性能问题,大可不必。作者已经编写了一个非.NET版本,性能几乎相同。如果SQL Server因为某些原因不能使用.NET Framework,可以使用非.NET版本xp_pcre,它也被发布在Code Project上。
如果SQL Server运行在带有/3GB开关的boot.ini文件中,这个DLL将无法工作。可能会得到一个错误,比如:“无法加载DLL xp_regex.dll,或者它引用的DLL之一”。原因是1114(一个动态链接库(DLL)初始化例程失败)。这个限制在.NET 1.1中已经被移除。
在SQL Server中与进程内运行托管代码可能会遇到一些问题。可以查看Clemens Vasters的博客文章,或者查看MSKB文章,这些文章讨论了使用.NET编写的扩展存储过程。作者已经在多个服务器上运行这个扩展存储过程,并且没有遇到任何问题。作者运行的服务器更多地用于报告而不是OLTP风格的事务处理。作者没有将CPU或RAM推到极限,也没有使用fibers。这可能是作者没有遇到任何问题的原因。
DLL中有四个扩展存储过程:
语法:
xp_regex_match @input, @regex, @result OUTPUT
@input是要匹配的文本。@regex是要匹配的正则表达式。@result是一个输出参数,将持有'Matched'、'Failed'或在正则表达式无效的情况下为NULL。所有参数都是(N)VARCHAR或(N)CHAR的任意长度。
语法:
xp_regex_format @input, @regex, @format_string, @result OUTPUT
@input是要解析的文本。@regex是要匹配的正则表达式。@format_string用于格式化结果。@result是一个输出参数,将持有格式化后的结果。
语法:
xp_regex_split @input, @regex, @column_number, @result OUTPUT
@input是要解析的文本。@regex是匹配分隔符的正则表达式。@column_number让指定哪个结果列应该在@result参数中返回。@result是一个输出参数,将持有格式化后的结果。
语法:
xp_regex_replace @input, @regex, @replacement, @result OUTPUT
@input是要解析的文本。@regex是一个正则表达式。@replacement将替换所有匹配正则表达式的文本。@result是一个输出参数,将持有结果。
FN_XP_REGEX_MATCH、FN_XP_REGEX_FORMAT、FN_XP_REGEX_SPLIT和FN_XP_REGEX_REPLACE是包装存储过程的用户定义函数。这样就可以在SELECT列表或WHERE子句中使用这些函数。
将xp_regex.dll复制到Program Files\Microsoft SQL Server\MSSQL\bin文件夹中。运行SQL脚本INSTALL.SQL。这将注册这些过程并创建用户定义的函数。