У мене є цей невеликий 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]
атрибута. Це точний код? Я не думаю, що це складеться. Відмінність версії Framework 2.0 / 3.0 / 3.5 не є проблемою, оскільки ви використовуєте 4.0 / 4.5 / 4.5.x / тощо або що інше на цьому сервері, оскільки ви перебуваєте на 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
?