2012-11-17 45 views
1

我有string與格式'S1CW3733|1050105000224,S1CW4923|1050105000009'SQL用戶定義函數來拆分串到多個列和行

我有功能在SQL其中轉換它在格式

item 
S1CW3733|1050105000224 
S1CW4923|1050105000009 

是有可能做到這一點這辦法 ? (多列)

item  item2 
S1CW3733 1050105000224 
S1CW4923 1050105000009 

我的功能: -

ALTER Function [dbo].[fnSplit] 
(
    @sInputList Varchar(8000), -- List of delimited items 
    @sDelimiter VarChar(8000) = ',' -- delimiter that separates items 
) 
Returns @List Table (item VarChar(8000)) 
Begin 
Declare @sItem VarChar(8000) 

While CharIndex(@sDelimiter,@sInputList,0) <> 0 
    Begin 
    Select 
    @sItem=RTrim(LTrim(SubString(@sInputList,1,CharIndex(@sDelimiter,@sInputList,0)-1))), 
    @sInputList=RTrim(LTrim(SubString(@sInputList,CharIndex(@sDelimiter,@sInputList,0)+Len(@sDelimiter),Len(@sInputList)))) 

    If Len(@sItem) > 0 
    Insert Into @List Select @sItem 
End 

If Len(@sInputList) > 0 
    Insert Into @List Select @sInputList -- Put the last item in 

Return 
End 
+0

這些[文章](http://stackoverflow.com/questions/11185318/如何分開字符串到不同的列)和[鏈接](http://www.codeproject.com/Articles/7938/SQL-User-Defined-Function-to-Parse-a-Delimited-Str )對你有幫助。 – bonCodigo

+0

行應該被','拆分,列應該被'|'拆分 – Shaggy

回答

2

好,如果你只有兩列,你永諾能做到這一點

select 
    left(f.item, c.c - 1) as item1, 
    right(f.item, len(f.item) - c.c) as item12 
from dbo.fnSplit('S1CW3733|1050105000224,S1CW4923|1050105000009', ',') as f 
    outer apply (select charindex('|', f.item) as c) as c 

我沒有檢查,如果CHARINDEX! = 0,所以你可以添加這個檢查。

但是,如果你必須分隔多列「|」,我不認爲有辦法做到這一點不存在動態SQL

1

的另一種方式。你可以修改你的功能。函數必須要有額外的參數 - 分割字符串的哪一部分返回。因此,在您的SQL請求,你會做這樣的事情:在這種情況下

select 
    fnSplit(item, ',', '|', 0) as item_left, 
    fnSplit(item, ',', '|', 1) as item_right 
from 
    mytable 

功能必須看起來像

ALTER Function [dbo].[fnSplit] 
    (
     @sInputList Varchar(8000), -- List of delimited items 
     @sDelimiter1 VarChar(8000) = ',', -- delimiter that separates items 
     @sDelimiter2 VarChar(8000) = '|', -- delimiter that separates splitted item 
     @which_part int = 0 -- if 0 return left part, 1 -right part 
    ) 
    Returns VarChar(8000) 
... business login here