有很多關於如何拆分字符串的例子。這裏的技巧是鏈接或連接序列。
如果打開到UDF
例
Select A.Column1
,B.*
From YourTable A
Cross Apply (
Select Column2=B1.RetVal
,Column3=B2.RetVal
,Column4=B3.RetVal
From [dbo].[tvf-Str-Parse](A.Column2,'~') B1
Join [dbo].[tvf-Str-Parse](A.Column3,'~') B2 on B1.RetSeq=B2.RetSeq
Join [dbo].[tvf-Str-Parse](A.Column4,'~') B3 on B1.RetSeq=B3.RetSeq
Where B1.RetVal is not null
and B2.RetVal is not null
and B3.RetVal is not null
) B
返回
Column1 Column2 Column3 Column4
JJ2222 BLUE BB1234 BLUE, BABY (BB1234)
JJ2222 BROWN BC2345 BROWN, COW (BC2345)
JJ2222 BLACK BD3456 BLACK, DOG (BD3456)
的UDF如果有意
CREATE FUNCTION [dbo].[tvf-Str-Parse] (@String varchar(max),@Delimiter varchar(10))
Returns Table
As
Return (
Select RetSeq = Row_Number() over (Order By (Select null))
,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
From (Select x = Cast('<x>' + replace((Select replace(@String,@Delimiter,'§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A
Cross Apply x.nodes('x') AS B(i)
);
--Thanks Shnugo for making this XML safe
--Select * from [dbo].[tvf-Str-Parse]('Dog,Cat,House,Car',',')
--Select * from [dbo].[tvf-Str-Parse]('John Cappelletti was here',' ')
有幾十個重複說相同:*避免*首先插入這些值。加載數據時拆分字符串要容易得多。您不能索引或搜索這些列。 SQL Server在2016年添加了一個'STRING_SPLIT'命令,可用於清理這些條目 –
Panagiotis - 感謝您的建議。是的,我熟悉2016年添加的String_Split函數,但不幸的是,此版本是2012. –