Ich habe diese kleine CLR, die eine RegEX-Funktion für eine Zeichenfolge in Spalten ausführt.
Bei der Ausführung unter SQL Server 2014 (12.0.2000) unter Windows Server 2012R2 stürzt der Prozess mit ab
Meldung 0, Ebene 11, Status 0, Zeile 0 Beim aktuellen Befehl ist ein schwerwiegender Fehler aufgetreten. Die Ergebnisse sollten, falls vorhanden, verworfen werden.
und gibt einen Stapelspeicherauszug, wenn ich tue
select count (*) from table where (CLRREGEX,'Regex')
Aber wenn ich das mache
select * from table where (CLRREGEX,'Regex')
es gibt die Zeilen zurück.
Funktioniert perfekt mit demselben SQL Server-Build, der unter Windows 8.1 ausgeführt wird.
Irgendwelche Ideen?
- Bearbeiten Es ist so einfach wie es nur geht
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);
}
}
Durch kleine Änderungen funktioniert dies jetzt: Die Hauptstunde in C # scheint dieselbe zu sein wie in TSQL. Achten Sie auf implizite Datenkonvertierung.
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]
Attributs. Ist das der genaue Code? Ich denke nicht, dass das kompilieren würde. Die Unterscheidung zwischen Framework Version 2.0 / 3.0 / 3.5 ist kein Problem, da Sie 4.0 / 4.5 / 4.5.x / etc verwenden oder was auch immer sich auf diesem Server befindet, da Sie sich in SQL Server 2014 befinden, das an CLR Version 4 gebunden ist Server zeigt das Problem 32-Bit? Wie viel Speicher hat es im Vergleich zu den anderen Servern? Haben Sie die SQL Server-Protokolle überprüft, nachdem Sie diesen Fehler erhalten haben?
MatchTimeout
Eigenschaft verwenden können. Aber ich denke nicht, dass das wirklich das Problem ist, auch wenn Sie nur maximal 5 Zeichen eingeben. Es ist möglich, dass auf diesem Computer eine beschädigte Installation von .NET Framework vorhanden ist, die repariert werden kann, sobald die Forellenfischerei eingestellt wurde ;-). Auch [0-9].*
ist einfach, aber auch ineffizient, da es allen Zeichen nach der ersten Ziffer entspricht, falls vorhanden; mit nur [0-9]
für eine IsMatch
ist besser.
DataAccessKind
zu Read
? Das verlangsamt es nur und Sie machen keinen Datenzugriff. Außerdem ist mir klar, dass es jetzt zu funktionieren scheint, aber ich würde vorsichtig sein, wenn ich die ToString()
Methode Value
anstelle der Eigenschaft verwende, da ich denke, dass ToString Kodierungen oder ähnliches nicht richtig handhabt. Auf welche Sortierung ist Ihre Datenbank eingestellt? Natürlich habe ich einen Ihrer Kommentare oben noch einmal gelesen und festgestellt, dass die Spalte VARCHAR anstelle von NVARCHAR ist. Hat dieses Feld eine andere Sortierung als die Datenbank?
SqlFunction
Methode als markiertIsDeterministic=true
? Ist die Baugruppe markiert alsSAFE
?