2010-03-16 13 views
3

Comment puis-je retourner une colonne d'identité avec un SQL standard CLR Split UDF par exemple le code ci-dessous renverra une table avec la valeur de chaîne divisée par délimiteur, je dois en quelque sorte retourner une colonne d'identité bien.Colonne d'identité dans 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 

Répondre

3

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.

+0

Comment ROW_NUMBER fonctionnerait-il? Que commanderiez-vous pour obtenir l'ordre d'origine dans la chaîne délimitée? –