SQL CLR用于将字符串拆分为二维数组

时间:2016-06-10 11:09:27

标签: c# sql-server

我是为SQL Server TVF编写SQL CLR的新手,并尝试创建用于将字符串(例如“1:2; 1:3; 1:4”)拆分为二维数组的程序集:

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction(
       FillRowMethodName = "FillRow_Multi",
       TableDefinition = "field nvarchar(4000), item nvarchar(4000)"
       )
    ]
    public static IEnumerable SplitString_Multi(
      [SqlFacet(MaxSize = -1)]
      SqlString Input,
      [SqlFacet(MaxSize = 1)]
      SqlChars Delimiter1,
      [SqlFacet(MaxSize = 1)]
      SqlChars Delimiter2
    )
    {
        return Input.Value.Split(Delimiter1[0]).Select(s => s.Split(Delimiter2[0]));
    }

    public static void FillRow_Multi(object obj, out SqlString field, out SqlString item)
    {
       *dont know*
    }

}

并且不知道如何正确实现FillRow_Multi方法。在此先感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

试试这个,

FileFilter

USAGE,

GetOpenFilename

答案 1 :(得分:0)

通过使用相同的SQL CLR split function,我可以多次拆分 我希望,以下案例正在解决您的要求 输入字符串值是2维的 它使用行分隔符和列分隔符来区分列和行

declare @inputstring nvarchar(max) = '1-2;5-6;100-200'
declare @d int = 0
;with cte as (
select 
    rowno = ROW_NUMBER() over (order by @d),
    r.string
from CLRSplitStringFunction(@inputstring,';',0) r
)
select 
    rowno,
    MAX(col1) col1,
    MAX(col2) col2
from (
select 
    rowno,
    case when ROW_NUMBER() over (partition by rowno order by @d) = 1 then c.string end as col1,
    case when ROW_NUMBER() over (partition by rowno order by @d) = 2 then c.string end as col2
from cte
cross apply CLRSplitStringFunction(cte.string,'-',0) c
) t
group by rowno

这是输出

enter image description here

我不确定两次使用拆分功能或使用单个函数的性能差异,该函数以所需的最终表格格式返回所有数据

答案 2 :(得分:0)

我希望,我已经设法:)创建您要求的SQL CLR split function

在推荐的教程中,我还分享了示例CLR项目源

我使用了这样的 FillRowMethod

Public Shared Sub FillRowMethod(ByVal row As Object,ByRef Id As SqlInt32,ByRef Col1 As String,ByRef Col2 As String)

主拆分功能定义如下 < SqlFunction(FillRowMethodName:=" FillRowMethod",TableDefinition:=" id int,column1 nvarchar(max),column2 nvarchar(max)")>

行的第一次拆分发生在主拆分函数中。

FillRowMethod函数用于列填充。它对前一个main函数创建的每一行都有效一次。 所以我在这个函数中拆分输入行字符串值。

请注意,对于可以将行拆分为多于预期列等的情况,应进一步开发该函数。

我添加了之前SQL CLR Split function的控件,以防止CLR函数返回空值。在这种情况下,我不确定它是否会按预期工作。