열의 문자열에서 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]
속성을 제외하고 코드가 잘 보입니다 . 그게 정확한 코드입니까? 나는 그것이 컴파일 될 것이라고 생각하지 않습니다. CLR 버전 4에 바인딩 된 SQL Server 2014를 사용하기 때문에 4.0 / 4.5 / 4.5.x / etc 또는 그 서버에있는 모든 것을 사용할 때 Framework 버전 2.0 / 3.0 / 3.5 구별은 문제가되지 않습니다. 서버에 문제가 32 비트로 표시됩니까? 다른 서버와 비교하여 얼마나 많은 메모리가 있습니까? 오류가 발생한 직후에 SQL Server 로그를 확인 했습니까?
MatchTimeout
속성을 사용할 수 있습니다 . 그러나 5 자 이하로 전달하는 경우 실제로 이것이 문제라고 생각하지 않습니다. 이다 이 하나의 기계가의 .NET Framework 설치 손상이 것이 가능하고, 송어 낚시 활동이 ;-) 중단 한 후 그 수리 할 수있다. 또한 [0-9].*
첫 번째 자리 뒤의 모든 문자와 일치하므로 간단하지만 비효율적입니다. 그냥 사용 [0-9]
하는 IsMatch
것이 좋습니다.
DataAccessKind
하려면 Read
? 그것은 속도를 늦추고 데이터 액세스를하지 않습니다. 또한, 나는 그것이 현재 작동하고있는 것처럼 보이지만 ToString이 인코딩을 올바르게 처리하지 않는다고 생각하는 것처럼 속성과 ToString()
반대 되는 방법 을 사용하는 데 신중해야 Value
합니다. 데이터베이스 데이터 정렬은 무엇으로 설정되어 있습니까? 물론 위의 의견 중 하나를 다시 읽고 열이 NVARCHAR 대신 VARCHAR임을 알 수 있습니다. 해당 필드가 데이터베이스와 다른 데이터 정렬을 가지고 있습니까?
SqlFunction
방법으로 표시IsDeterministic=true
? 어셈블리가로 표시되어SAFE
있습니까?