如何修改函数以获取三列输出



我让这个函数来拆分字符串,但它在我想要的一列中给出了尖刺的字符串,如下所示。

如何修改函数以获取如下所示的输出。

我在谷歌上找到了这个功能。

CREATE FUNCTION dbo.Split(@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 * from dbo.Split('hello hi guys',' ');
items
--------
hello
hi
guys
I want like this 
col1    col2     col3
_____  _______  _______
hello   hi       guys

如果您可以保证不会将 XML 字符传递到@String,请尝试以下操作...

更新以使对 XML 字符"更安全"(尽管如果包含]]>它仍然会失败......

CREATE FUNCTION dbo.Split(@String varchar(8000), @Delimiter char(1))       
returns @temptable TABLE (col1 varchar(8000), col2 varchar(8000), col3 varchar(8000))       
as       
begin
    declare @xml xml
    set @xml = '<data><col><![CDATA[' + 
                replace(@String,@Delimiter,']]></col><col><![CDATA[') + 
                ']]></col></data>'
    insert into @temptable (col1, col2, col3)
    select parts.value('col[1]','varchar(8000)'),
        parts.value('col[2]','varchar(8000)'),
        parts.value('col[3]','varchar(8000)')
    from @xml.nodes('/data') as parts(parts)
return       
end  

最新更新