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