У меня есть этот маленький CLR, который выполняет функцию RegEX для строки в столбцах.
При запуске на SQL Server 2014 (12.0.2000) в Windows Server 2012R2 процесс завершается с
Сообщение 0, уровень 11, состояние 0, строка 0 Произошла серьезная ошибка в текущей команде. Результаты, если таковые имеются, должны быть отброшены.
и дает дамп стека, если я делаю
select count (*) from table where (CLRREGEX,'Regex')
но когда я сделаю
select * from table where (CLRREGEX,'Regex')
он возвращает строки.
Отлично работает на той же сборке SQL Server, работающей на Windows 8.1.
Есть идеи?
- Редактировать Это так просто, как может быть
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]
атрибута duplicate . Это точный код? Я не думаю, что это скомпилируется. Различие в версии 2.0 / 3.0 / 3.5 платформы не является проблемой, поскольку вы используете 4.0 / 4.5 / 4.5.x / etc или что-то еще на этом сервере, так как вы используете SQL Server 2014, который привязан к CLR версии 4. Является ли сервер показывает проблему 32-бит? Сколько памяти у него по сравнению с другими серверами? И вы проверили журналы SQL Server сразу после получения этой ошибки?
MatchTimeout
свойство. Но я не думаю, что это действительно проблема, если вы проходите не более 5 символов. Это является возможным , что это одна машина имеет поврежденную установку в .NET Framework, и которые могут быть восстановлены , как только форель промысловая деятельность перестала ;-). Кроме того, [0-9].*
это просто, но также неэффективно, поскольку оно соответствует всем символам, если они есть, после первой цифры; лучше использовать только [0-9]
для IsMatch
.
DataAccessKind
на Read
? Это только замедляет его, и вы не делаете никакого доступа к данным. Кроме того, я понимаю, что он, кажется, работает сейчас, но я буду осторожен с использованием ToString()
метода, а не со Value
свойством, так как не думаю, что ToString правильно обрабатывает кодировки или что-то в этом роде. Как настроено сопоставление баз данных? Конечно, я просто перечитал один из ваших комментариев выше и увидел, что столбец VARCHAR вместо NVARCHAR. Это поле имеет другое сопоставление, чем база данных?
SqlFunction
метод помечен какIsDeterministic=true
? Помечена ли сборка какSAFE
?