我是为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方法。在此先感谢您的帮助!
答案 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
这是输出
我不确定两次使用拆分功能或使用单个函数的性能差异,该函数以所需的最终表格格式返回所有数据
答案 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函数返回空值。在这种情况下,我不确定它是否会按预期工作。