如何使用标准 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
就 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 开始递增 ID 的计数器。
您可能还需要考虑可以在 SQL 本身中生成代理 IDROW_NUMBER
,因此可能根本没有必要这样做。这是我个人的选择,但如果您需要在 CLR 输出中执行此操作,上面的代码应该可以解决问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)