Столбец идентификаторов в SQL CLR Split UDF

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

<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

person PVDM    schedule 16.03.2010    source источник


Ответы (1)


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

Простым ответом было бы просто сгенерировать индексы на месте, а затем отправить 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, приведенный выше код должен помочь.

person Aaronaught    schedule 16.03.2010
comment
Как будет работать ROW_NUMBER? Что бы вы заказали, чтобы получить исходный порядок в строке с разделителями? - person Mark Sowul; 31.10.2013