如何在T-SQL中拆分字符串?

9
我有一个varchar @a='a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p'变量,其中包含以|分隔的值。我想将这个变量拆分成数组或表格。
请问该如何操作?

1
https://dev59.com/XnRC5IYBdhLWcg3wYP-h,https://dev59.com/RXRB5IYBdhLWcg3wLUu3 - Daniel Vassallo
可能是https://dev59.com/GnVD5IYBdhLWcg3wXacd的重复问题。 - Matt Hamilton
4个回答

13

像这样使用表值函数:

CREATE FUNCTION Splitfn(@String varchar(8000), @Delimiter char(1))       
returns @temptable TABLE (items varchar(8000))       
as       
begin       
    declare @idx int       
    declare @slice varchar(8000)       

    select @idx = 1       
        if len(@String)<1 or @String is null  return       

    while @idx!= 0       
    begin       
        set @idx = charindex(@Delimiter,@String)       
        if @idx!=0       
            set @slice = left(@String,@idx - 1)       
        else       
            set @slice = @String       

        if(len(@slice)>0)  
            insert into @temptable(Items) values(@slice)       

        set @String = right(@String,len(@String) - @idx)       
        if len(@String) = 0 break       
    end   
return      

end

获取您的变量,并像这样使用此函数:

SELECT i.items FROM dbo.Splitfn(@a,'|') AS i

@gbn,数字表格比循环执行更快吗?能否详细解释一下? - ACP
1
请在我的回答中查看我的链接。 - gbn
有更优雅的解决方案,但是当支持SQL 2005及以下版本的遗留代码库时,这是唯一的选择。 - Manuel Castro
你应该清理从函数返回的临时表吗? - nulltron

2
尝试这个:
declare @a varchar(10) 
set @a = 'a|b|c|'
while len(@a) > 1
begin
insert into #temp
select substring(@a,1,patindex('%|%',@a)-1);
set @a = substring(@a,patindex('%|%',@a)+1,len(@a))
end;

不错的解决方案,但需要澄清 - 字符串以分隔符号结尾很重要。如果没有 - 你会陷入无限循环。 - Alexey Shcherbak
我的建议是在你的“set @a”行后添加以下语句:IF(patindex('%|%',@a)=0) BEGIN INSERT INTO #temp select @a; BREAK; END; - Alexey Shcherbak

2

1
也许您可以通过解释如何将此方法应用于在每个分隔符处拆分文本来改进答案。=) - jumxozizi


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接