2012-06-24 17 views
0

我得到了這個函數來拆分字符串,但它給了我想要的下面一列中的spited字符串。如何修改函數以獲得三列輸出?

我該如何修改函數來得到如下的輸出。

我在google上發現了這個功能。

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 
+3

你不能有這樣的功能。你可以得到一個*變量的唯一途徑*列的結果集數是構造查詢文本並運行它(又名動態小號QL)。您不能在用戶定義函數中執行動態SQL。 –

+0

@Damien_The_Unbeliever如果字符串包含2個單詞,則將字符串拆分爲3個不同的字符串的任何其他方式最後一個字符串對於1個字符應該是空白相同的,最後2個字段應該是空白的。 – user614978

+0

如果字符串最多隻有2個空格(即3個字),那麼使函數返回一個帶有3列的表格......否則Damien是正確的,你不能讓用戶定義的函數返回一個帶有動態列的表格。 – freefaller

回答

2

如果你能保證沒有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