|
正则表达式在处理字符串方面有其特殊的优势,但是 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 数据库中,再在用户数据库下创建这些函数的同以词以方便调用(有点麻烦)。 |
|