我有这个小的CLR,它对列中的字符串执行RegEX功能。
在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]
属性除外。那是确切的代码吗?我认为不会编译。框架版本2.0 / 3.0 / 3.5的区别不是问题,因为您使用的是4.0 / 4.5 / 4.5.x / etc或该服务器上的任何内容,因为您使用的是绑定到CLR版本4的SQL Server 2014。服务器显示问题的32位?与其他服务器相比,它有多少内存?并且在收到该错误后是否检查了SQL Server日志?
MatchTimeout
属性。但是,如果您最多传入5个字符,我也不认为这是真正的问题。这是可能的,这种一体机有一个损坏的安装.NET Framework的,而一旦钓鳟鱼的活动已经停止;-)可以修复。同样,它[0-9].*
很简单,但效率也很低,因为它匹配第一个数字后的所有字符(如果有);只[0-9]
使用一个IsMatch
更好。
DataAccessKind
成Read
?这只会减慢速度,并且您没有进行任何数据访问。另外,我确实意识到它现在似乎可以正常工作,但是我会谨慎使用ToString()
方法而不是Value
属性,因为我认为ToString无法正确处理编码或类似的东西。您的数据库排序规则设置为什么?当然,我只是重新阅读了您上面的评论之一,然后看到该列是VARCHAR而不是NVARCHAR。该字段的排序规则与数据库是否不同?
SqlFunction
方法是否标记为IsDeterministic=true
?程序集是否标记为SAFE
?