6

我正在尝试改进链接http://msdn.microsoft.com/en-us/magazine/cc163473.aspx中的 Clr 功能。

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 ) );
    }
}

当执行select * from Table1 where dbo.RegexMatch(col1, 'pattern') = 1时,Clr 函数为表中的每一行创建一个新的 Regex 对象。

是否可以为每个 Sql 语句只创建一个 Regex 对象?对于每一行,只需调用regex.Ismatch(...). 以下代码有效吗?

public static partial class UserDefinedFunctions 
{
    public static readonly RegexOptions Options =
        RegexOptions.IgnorePatternWhitespace |
        RegexOptions.Singleline;

    static Regex regex = null;

    [SqlFunction]
    public static SqlBoolean RegexMatch(
        SqlChars input, SqlString pattern)
    {
        if (regex == null) 
            regex = new Regex( pattern.Value, Options );
        return regex.IsMatch( new string( input.Value ) );
    }
}
4

1 回答 1

2

您的静态正则表达式的基于 UDF 的实例可能甚至没有被重复使用,您最好调用静态版本

System.Text.RegularExpressions.RegEx.IsMatch(string input, string pattern, RegexOptions options);

直接地。

请注意,在调试模式下的工作方式与它们在生产环境中的工作方式不同,并且 SQL 会在需要时释放内存。

另外,尝试使用RegexOptions.Compiledand CultureInvariant

于 2014-02-15T12:08:43.020 回答