Столбец идентичности в SQL CLR Split UDF - PullRequest
3 голосов
/ 16 марта 2010

Как я могу вернуть столбец идентификаторов со стандартным UDF SQL CLR Split, например, приведенный ниже код вернет таблицу со строковым значением, разделенным по разделителю, мне также нужно как-то вернуть столбец идентификаторов.

<SqlFunction(FillRowMethodName:="FillRow", TableDefinition:="value nvarchar(4000)")> _
Public Shared Function GetStrings(ByVal str As SqlString, ByVal delimiter As SqlString) As IEnumerable
    If (str.IsNull OrElse delimiter.IsNull) Then
        Return Nothing
    Else
        Return str.Value.Split(CChar(delimiter))
    End If
End Function
Public Shared Sub FillRow(ByVal row As Object, ByRef str As String)
    str = CType(row, String).Trim()
End Sub

1 Ответ

3 голосов
/ 16 марта 2010

В терминах CLR UDF «идентичность» не имеет никакого особого значения, поскольку вы сами генерируете все строки. Все, что вы хотите, это счетчик.

Простым ответом было бы просто создать индексы на месте, а затем отправить IEnumerable составных значений. Так что-то вроде этого:

[SqlFunction(FillRowMethodName = "FillMyRow",
    TableDefinition = "ID int, Value nvarchar(4000)")]
public static IEnumerable GetStrings(SqlString str, SqlString delimiter)
{
    if (str.IsNull || delimiter.IsNull)
    {
        return null;
    }

    string[] values = str.Value.Split(delimiter.Value.ToCharArray());
    StringPair[] results = new StringPair[values.Length];
    for (int i = 0; i < values.Length; i++)
    {
        results[i] = new StringPair(i + 1, values[i]);
    }
    return results;
}

public static void FillMyRow(object row, ref int id, ref string value)
{
    StringPair pair = (StringPair)row;
    id = pair.ID;
    value = pair.Value;
}

public class StringPair
{
    public StringPair(int id, string value)
    {
        this.id = id;
        this.value = value;
    }

    public int ID { get; private set; }
    public string Value { get; private set; }
}

Это то же самое, что и столбец идентификации; вы просто увеличиваете счетчик для идентификатора, начиная с цифры 1.

Возможно, вы также захотите учесть, что суррогатный идентификатор может быть сгенерирован в самом SQL с помощью ROW_NUMBER, поэтому в этом нет необходимости делать это вообще. Лично это был бы мой выбор, но если вам нужно сделать это в выводе CLR, вышеприведенный код должен помочь.

...