C# 填充行方法是否保留元素的顺序(SQL CLR函数)?

C# 填充行方法是否保留元素的顺序(SQL CLR函数)?,c#,regex,tsql,sql-server-2012,sqlclr,C#,Regex,Tsql,Sql Server 2012,Sqlclr,我有以下C函数: [SqlFunction(FillRowMethodName = "FillRowForSplit")] public static IEnumerable Split(SqlString sqlInput, SqlString sqlPattern) { string[] substrings; if (sqlInput.IsNull || sqlPattern.IsNull) { substrings = new string[0]

我有以下C函数:

[SqlFunction(FillRowMethodName = "FillRowForSplit")]
public static IEnumerable Split(SqlString sqlInput, SqlString sqlPattern)
{
    string[] substrings;

    if (sqlInput.IsNull || sqlPattern.IsNull)
    {
        substrings = new string[0];
    }
    else
    {
        substrings = Regex.Split(sqlInput.Value, sqlPattern.Value);
    }

    return substrings;
}

public static void FillRowForSplit(Object value, out SqlString sqlValue)
{
    sqlValue = new SqlString(value.ToString());
}
它通常是通过正则表达式拆分值。以下是T-SQL的定义:

CREATE FUNCTION [RegexSplit](@input NVARCHAR(MAX), @pattern NVARCHAR(MAX))
RETURNS TABLE ([value] NVARCHAR(MAX))
AS 
EXTERNAL NAME [Utils].[RegularExpression].[Split];
GO
这是一个有效的例子:

SELECT [value]
FROM [RegexSplit]('10527,!!10528,!!10529,!!10530,!!10526', ',!!');

问题是,我能否确保各个元素的顺序得到保留?或者我应该重写C函数,以便将每个元素与索引匹配并返回索引,同样。

单独元素的顺序被保留,因为即使为正则表达式指定了RightToLeft选项,正则表达式也会按顺序处理字符。

Regex.Split应该保留顺序,因为它将字符串从第一个字符遍历到最后一个字符。如果顺序很关键,我会添加索引。在这种简单的情况下,顺序可以保留,但如果没有ORDERBY子句,select语句返回的元素的顺序是未定义的。谁知道在sqlserver查询处理器的厨房里会发生什么,例如,如果选择T.col、RS.value、按T.col1划分的行数按T.col2从T cross apply RegexSplitT.col、按T.col划分的@delimiter order,这又是较大查询的子部分。在FillRow的输出和目标点之间,数据可能会被假脱机、分段并重新排序。@i-one是的,我添加了一个索引以确保。