Erstellen einer SQL CLR-Funktion ist der Weg zu gehen. Sie sind extrem schnell und stark. Es wäre schnell und effektiv, da Sie keinen vorhandenen Code ändern müssten, und Sie könnten alle Informationen angeben, die Sie direkt in Ihren SQL-Anweisungen benötigen.
Die SQL CLR-Funktion könnte eine Eingabezeichenfolge sowie andere Parameter akzeptieren, die angeben, welche Informationen Sie aus der Eingabezeichenfolge extrahieren möchten. Sie können dann die Rückgabewerte der Funktion sortieren.
Insbesondere würde ich eine generische Funktion erstellen, die drei Parameter akzeptiert: eine Eingabezeichenfolge, einen regulären Ausdruck und einen Gruppennamen. Mit dieser Funktion können Sie Ihr Datenbankfeld und einen regulären Ausdruck mit benannten Gruppen direkt in der SQL-Anweisung übergeben.
Die SQL-CLR-Funktion würde eine Regex erstellen, testen Sie es gegen die Saite, und würde letztlich Rückkehr der Wert der angepassten Gruppe oder null, wenn es keine Übereinstimmung oder die Gruppe war nicht angepasst (wenn die Gruppe optional war). Im Idealfall sollten Sie jedem Aufruf den gleichen regulären Ausdruck übergeben (vielleicht als Variable wie @regex), um CLR-Caching des kompilierten regulären Ausdrucks zu nutzen. Das Endergebnis wäre sehr flexibel und schnell.
Reguläre Ausdruckoptionen können inline wie folgt im Muster angegeben werden: "(? Imnsx-imnsx: Teilausdruck)". Siehe: msdn.microsoft.com/en-us/library/yd1hzczs.aspx
Der Code für eine solche Funktion würde wie folgt aussehen:
[SqlFunction(IsDeterministic=true,IsPrecise=true,DataAccess=DataAccessKind.None,SystemDataAccess=SystemDataAccessKind.None)]
public static SqlString RegexMatchNamedGroup(SqlChars input, SqlString pattern, SqlString group_name)
{
Regex regex = new Regex(pattern.Value);
Match match = regex.Match(new string(input.Value));
if (!match.Success) //return null if match failed
return SqlString.Null;
if (group_name.IsNull) //return entire string if matched when no group name is specified
return match.Value;
Group group = match.Groups[group_name.Value];
if (group.Success)
return group.Value; //return matched group value
else
return SqlString.Null; //return null if named group was not matched
}
Ihre SQL-Anweisung könnte dann sortieren auf Teile Ihrer Informationen wie so:
declare @regex nvarchar(2000) = '^(?<Major>\d{1,3})\.(?<Minor>\d{1,3})';
select VersionNumber
from YourTable
order by
Cast(RegexMatchNamedGroup(VersionNumber, @regex, 'Major') as int),
Cast(RegexMatchNamedGroup(VersionNumber, @regex, 'Minor') as int)
Welches Format ist es genau gespeichert? – gbn