2010-08-04 2 views
1

Я создал функцию для реализации regex.split в sql. Вот код:реализация повторного выделения regex для сервера 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; 
} 

Однако, когда я пытаюсь, я получаю значения id, но пустые текстовые значения. Может кто-нибудь помочь?

+0

Это боян, ищу оригинал. Редактировать: Не совсем обман, но я обманул свой ответ :) – leppie

ответ

0

Здесь вы идете (компилировать как сборка 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; 
    } 
} 

Родом из: microsoft sql equivalent of mysql REGEXP

0

Я подозреваю, что регулярное выражение, которое вы используете, возвращает массив пустых строк или пробелов. Вы пытались настроить простой тестовый кадр командной строки для самого выражения?

Я не вижу ничего плохого в этом коде, за исключением того, что Options не определено. Является ли это константой, определенной в других местах?