Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL CLR拆分UDF中的标识列_Sql Server_Clr_Split_User Defined Functions - Fatal编程技术网

Sql server SQL CLR拆分UDF中的标识列

Sql server SQL CLR拆分UDF中的标识列,sql-server,clr,split,user-defined-functions,Sql Server,Clr,Split,User Defined Functions,如何使用标准SQL CLR Split UDF返回标识列例如,下面的代码将返回一个带有按分隔符拆分的字符串值的表,我还需要以某种方式返回标识列 <SqlFunction(FillRowMethodName:="FillRow", TableDefinition:="value nvarchar(4000)")> _ Public Shared Function GetStrings(ByVal str As SqlString, ByVal delimiter As SqlStrin

如何使用标准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
_
作为IEnumerable的公共共享函数getString(ByVal str作为SqlString,ByVal分隔符作为SqlString)
如果(str.IsNull或lse delimiter.IsNull),则
一无所获
其他的
返回str.Value.Split(CChar(分隔符))
如果结束
端函数
公共共享子FillRow(ByVal行作为对象,ByRef str作为字符串)
str=CType(行,字符串).Trim()
端接头
对于CLR UDF,“identity”没有任何特殊含义,因为所有行都是您自己生成的。你只要一个柜台

简单的答案是,在现场生成索引,然后发送一个组合值的
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; }
}
[SqlFunction(FillRowMethodName=“FillMyRow”,
TableDefinition=“ID int,Value nvarchar(4000)”)]
公共静态IEnumerable GetStrings(SqlString str,SqlString分隔符)
{
if(str.IsNull | | delimiter.IsNull)
{
返回null;
}
string[]values=str.Value.Split(delimiter.Value.ToCharArray());
StringPair[]结果=新的StringPair[values.Length];
for(int i=0;i
它与身份栏完全相同;您只是从数字1开始递增ID的计数器


您可能还想考虑在SQL本身中生成一个代理ID,该代码是“代码> RooSoxNo./COD>”,所以根本不必这样做。就我个人而言,这是我的选择,但如果需要在CLR输出中这样做,上面的代码应该可以做到。

行数如何工作?要获得分隔字符串中的原始顺序,您将按什么顺序排序?