Sql 如何修改函数以获得三列输出?

Sql 如何修改函数以获得三列输出?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我得到了这个分割字符串的函数,但它在一列中给出了我想要的字符串,如下所示 如何修改函数以获得如下输出 我在谷歌上找到了这个函数 CREATE FUNCTION dbo.Split(@String varchar(8000), @Delimiter char(1)) returns @temptable TABLE (items varchar(8000)) as begin declare @idx int d

我得到了这个分割字符串的函数,但它在一列中给出了我想要的字符串,如下所示

如何修改函数以获得如下输出

我在谷歌上找到了这个函数

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  

你不可能有这样的功能。获得结果集中可变列数的唯一方法是将查询构造为文本并运行它(也称为动态SQL)。您不能在用户定义的函数中执行动态SQL。@Damien_不相信用任何其他方法将字符串拆分为3个不同的列。如果字符串包含2个单词,则最后一列应为空。对于1个单词,最后两列应为空。如果字符串最多只有2个空格,即3个单词,然后让函数返回一个包含3列的表。。。否则,Damien是正确的,您不能让用户定义的函数返回具有动态列的表。是否始终希望有3列?如果有一个4个单词的句子,它应该有四列吗?@AmitBhargava将有3个单词或2个单词或1个单词。