[英]SQL CLR for splitting string into two dimensional array
我是为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方法。 在此先感谢您的帮助!
尝试这个,
ALTER FUNCTION [dbo].[fnRecursiveSplitString] (
@input VARCHAR(255)
,@Delimeter1 CHAR(1)
,@Delimeter2 CHAR(1)
)
RETURNS TABLE
AS
RETURN (
WITH CTE1 AS (
SELECT substring(@input, 0, charindex(@Delimeter1, @input)) field
,substring(@input, charindex(@Delimeter1, @input) + 1, (charindex(@Delimeter2, @input) - charindex(@Delimeter1, @input)) - 1) item
,CAST(STUFF(@input, 1, charindex(@Delimeter2, @input), '') AS VARCHAR(255)) INPUT
,1 RN
UNION ALL
SELECT CASE
WHEN LEN(INPUT) > 0
THEN CASE
WHEN charindex(@Delimeter2, INPUT) > 0
THEN substring(substring(INPUT, 0, charindex(@Delimeter1, INPUT)), 0, charindex(@Delimeter2, INPUT))
ELSE substring(INPUT, 0, charindex(@Delimeter1, INPUT))
END
END
,CASE
WHEN LEN(INPUT) > 0
THEN substring(INPUT, charindex(@Delimeter1, INPUT) + 1, CASE
WHEN charindex(@Delimeter2, INPUT) > 0
THEN (charindex(@Delimeter2, @input) - charindex(@Delimeter1, @input)) - 1
ELSE LEN(INPUT)
END)
END
,CASE
WHEN LEN(INPUT) > 0
THEN CAST(STUFF(INPUT, 1, CASE
WHEN charindex(@Delimeter2, INPUT) > 0
THEN charindex(@Delimeter2, INPUT)
ELSE LEN(INPUT)
END, '') AS VARCHAR(255))
END
,RN + 1
FROM cte1
WHERE len(INPUT) > 0
)
SELECT rn RowNum
,field
,item
FROM CTE1
)
用法,
SELECT * FROM [dbo].[fnRecursiveSplitString]('1:2;1:3;1:4',':',';')
SELECT * FROM [dbo].[fnRecursiveSplitString]('aaa:111' + char(10) + 'bbb:222'+ char(10) + '222:ddd' + char(10) + 'ccc:333' + char(10), ':', char(10))
通过使用相同的SQL CLR拆分函数 ,我可以拆分多次,希望在以下情况下满足您的要求输入字符串值为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
这是输出
我不确定使用两次拆分函数还是使用单个函数以期望的最终表格格式返回所有数据的性能差异
我希望,我已经完成了:)创建您请求的SQL CLR拆分功能
在参考的教程中,我还共享了示例CLR项目源
我使用了这样的FillRowMethod
公共共享的子FillRowMethod(ByVal行作为对象,ByRef ID作为SqlInt32,ByRef Col1作为字符串,ByRef Col2作为字符串)
并且主要的拆分函数定义如下<SqlFunction(FillRowMethodName:=“ FillRowMethod”,TableDefinition:=“ id int,column1 nvarchar(max),column2 nvarchar(max)”)>
行的第一次拆分在主拆分函数中进行。
FillRowMethod函数用于填充列。 对于上一个主要功能创建的每一行,它仅工作一次。 因此,我在此函数中拆分了输入行字符串值。
请注意,对于行可以拆分为超出预期的列等情况,应进一步开发该功能。
我从以前的SQL CLR Split函数添加了一个控件,以防止CLR函数返回空值。 在这种情况下,我不确定它是否会按预期工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.