En termes d'une UDF CLR, « identité » n'a pas de signification particulière, puisque vous générez toutes les lignes vous-même. Tout ce que tu veux, c'est un compteur. La réponse simple serait simplement de générer les index sur place, puis envoyer un IEnumerable
de valeurs composites. Donc, quelque chose comme ceci:
[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; }
}
C'est exactement la même chose qu'une colonne d'identité; vous ne faites qu'incrémenter un compteur pour l'ID, en commençant par le numéro 1.
Vous pouvez également considérer qu'un ID de substitution peut être généré dans SQL lui-même avec ROW_NUMBER
, il n'est donc peut-être pas nécessaire de le faire à tout. Ce serait mon choix, personnellement, mais si vous avez besoin de le faire dans la sortie CLR, le code ci-dessus devrait faire l'affaire.
Comment ROW_NUMBER fonctionnerait-il? Que commanderiez-vous pour obtenir l'ordre d'origine dans la chaîne délimitée? –