2010-08-04 8 views
1

J'ai créé une fonction pour implémenter le regex.split en sql. Voici le code:implémentation fractionnée regex pour le serveur SQL

private static IEnumerable<IndexedValue<T>> ToIndexedValue<T>(IEnumerable<T> list) 
{ 
    int idx = 1; 
    foreach (T value in list) 
    yield return new IndexedValue<T>(++idx, value); 
} 
private struct IndexedValue<T> 
{ 
    public int Index; 
    public T Value; 
    public IndexedValue(int index, T value) 
    { 
    Index = index; 
    Value = value; 
    } 
} 
[SqlFunction(FillRowMethodName = "FillSplit", 
    TableDefinition = "[ID] int, [Value] nvarchar(max)")] 
public static IEnumerable RegexSplit(SqlString input, SqlString pattern) 
{ 
    if (input.IsNull) 
    input = String.Empty; 
    if (pattern.IsNull) 
    pattern = String.Empty; 
    try 
    { 
    return ToIndexedValue<string>(Regex.Split(input.Value, pattern.Value, Options)); 
    } 
    catch 
    { 
    throw; 
    } 
} 
public static void FillSplit(object obj, out int id, out SqlString value) 
{ 
    IndexedValue<string> iv = (IndexedValue<string>)obj; 
    id = iv.Index; 
    value = iv.Value; 
} 

Cependant quand je l'essaie, j'obtiens des valeurs d'id mais des valeurs de texte vides. Quelqu'un peut-il aider?

+0

C'est dupe, à la recherche d'origine. Edit: Pas vraiment dupe, mais j'ai dupe ma réponse :) – leppie

Répondre

0

Ici, vous allez (compiler comme assemblage SQL CLR):

using System.Collections; 
using System.Text.RegularExpressions; 
using Microsoft.SqlServer.Server; 

public partial class UserDefinedFunctions 
{ 
    [SqlFunction] 
    public static bool RegexMatch(string expr, string regex) 
    { 
    return Regex.IsMatch(expr, regex); 
    } 

    [SqlFunction] 
    public static string RegexReplace(string expr, string regex, string replace) 
    { 
    return Regex.Replace(expr, regex, replace); 
    } 

    [SqlFunction(FillRowMethodName="GetToken", 
     TableDefinition="Value nvarchar(max)")] 
    public static IEnumerable RegexSplit(string expr, string regex) 
    { 
    return Regex.Split(expr, regex); 
    } 

    public static void GetToken(object row, out string str) 
    { 
    str = (string) row; 
    } 
} 

Originaire de: microsoft sql equivalent of mysql REGEXP

0

Je suppose que l'expression régulière que vous utilisez renvoie un tableau de chaînes ou d'espaces vides. Avez-vous essayé de configurer un cadre de test de ligne de commande simple pour l'expression elle-même?

Je ne vois rien de mal avec ce code, sauf que Options est indéfini. Est-ce une constante définie ailleurs?