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関数はテーブルの各行に新しい正規表現オブジェクトを作成します。

SQLステートメントごとに1つの正規表現オブジェクトのみを作成することは可能ですか?各行について、を呼び出すだけ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.CompiledくださいCultureInvariant

于 2014-02-15T12:08:43.020 に答える