列内の文字列に対してRegEX関数を実行するこの小さなCLRがあります。
Windows Server 2012R2上のSQL Server 2014(12.0.2000)で実行すると、プロセスがクラッシュします
メッセージ0、レベル11、状態0、行0現在のコマンドで重大なエラーが発生しました。結果があれば、破棄する必要があります。
スタックダンプを提供します
select count (*) from table where (CLRREGEX,'Regex')
しかし、私がするとき
select * from table where (CLRREGEX,'Regex')
行を返します。
Windows 8.1で実行されている同じSQL Serverビルドで完全に動作します。
何か案は?
-編集それはできる限り簡単です
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlTypes; //SqlString, SqlInt32, SqlBoolean
using System.Text.RegularExpressions; //Match, Regex
using Microsoft.SqlServer.Server; //SqlFunctionAttribute
public partial class UserDefinedFunctions
{
public static readonly RegexOptions Options = RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline;
[SqlFunction]
[Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true, IsPrecise = true)]
public static SqlBoolean RegExMatch(SqlString input, SqlString pattern)
{
if (input.IsNull || pattern.IsNull) //nulls dont qualify for a match
return SqlBoolean.False;
return Regex.IsMatch(input.Value, pattern.Value, RegexOptions.IgnoreCase);
}
}
少し変更するだけで、これで動作します。C#のメインレッスンは、暗黙的なデータ変換に注意してTSQLのレッスンと同じように見えます。
using System;
using System.Text;
using System.Data.SqlTypes; //SqlString, SqlInt32, SqlBoolean
using System.Text.RegularExpressions; //Match, Regex
using Microsoft.SqlServer.Server; //SqlFunctionAttribute
public partial class UserDefinedFunctions
{
public static readonly RegexOptions Options = RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant;
[Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true, IsPrecise = true, DataAccess = DataAccessKind.Read)]
public static SqlBoolean RegExMatch(SqlString input, SqlString pattern)
{
if (input.IsNull || pattern.IsNull) //nulls dont qualify for a match
return SqlBoolean.False;
string sqldata = input.ToString();
string regex = pattern.ToString();
return Regex.IsMatch(sqldata, regex);
}
[SqlFunction]
属性を除いて、コードは正常に見えます。それは正確なコードですか?私はそれがコンパイルされるとは思わない。Frameworkバージョン2.0 / 3.0 / 3.5の区別は、CLRバージョン4にバインドされているSQL Server 2014を使用しているため、4.0 / 4.5 / 4.5.x /などまたはそのサーバー上にあるものを使用しているため、問題ではありません。サーバーは問題の32ビットを表示していますか?他のサーバーと比較してどのくらいのメモリがありますか?また、そのエラーが発生した直後にSQL Serverログを確認しましたか?
MatchTimeout
プロパティを使用できることを意味するため、すべてのサーバーが少なくとも4.5にあるかどうかを知ることは良いことです。ただし、最大で5文字しか渡さない場合、これが実際に問題になるとは思わない ある、この1台のマシンが、.NET Frameworkのインストール破損している可能性があり、鱒漁業活動が;-)終わったらそれを修復することができます。また、[0-9].*
シンプルですが、最初の桁以降のすべての文字が存在する場合は一致するため、非効率的です。だけ[0-9]
に使用するIsMatch
方が良いです。
DataAccessKind
たのRead
ですか?それはただそれを遅くし、データアクセスをしていません。また、私はそれが今働いているように見えることを理解していますが、ToStringがエンコーディングなどを適切に処理するとは思わないToString()
ため、Value
プロパティではなくメソッドを使用することに注意します。データベース照合は何に設定されていますか?もちろん、上記のコメントの1つを読み直したところ、列がNVARCHARではなくVARCHARであることがわかりました。そのフィールドには、データベースとは異なる照合順序がありますか?
SqlFunction
としてマークされた方法はIsDeterministic=true
?アセンブリはとしてマークされていSAFE
ますか?