2012-11-30 22 views

回答

4

如果你知道你將會有確切的4列,那麼你也可以使用這個嵌套的CTE版本:

;with s1 (name, extra) as 
(
    select left(data, charindex('/', data)-1), 
    substring(data, charindex('/', data) +1, len(data)) 
    from yourtable 
), 
s2 (name, surname, extra) as 
(
    select name, 
    left(extra, charindex('/', extra)-1), 
    substring(extra, charindex('/', extra)+1, len(extra)) 
    from s1 
), 
s3 (name, surname, [character], company) as 
(
    select name, 
    surname, 
    left(extra, charindex('/', extra)-1), 
    substring(extra, charindex('/', extra)+1, len(extra)) 
    from s2 
) 
select * 
from s3; 

SQL Fiddle with Demo

結果是:

| NAME | SURNAME | CHARACTER | COMPANY | 
----------------------------------------- 
| Peter | Parker | Spiderman | Marvel | 
| Bruce | Wayne | Batman |  DC | 

或者你可以實現分割數據的CTE,然後執行一個PIVOT

;with cte (item, data, colNum, rn) as 
(
    select cast(left(data, charindex('/',data+'/')-1) as varchar(50)) item, 
    stuff(data, 1, charindex('/',data+'/'), '') data, 
    1 colNum, 
    row_number() over(order by data) rn 
    from yourtable 
    union all 
    select cast(left(data, charindex('/',data+'/')-1) as varchar(50)) , 
    stuff(data, 1, charindex('/',data+'/'), '') data, 
    colNum+1, 
    rn 
    from cte 
    where data > '' 
) 
select [1] as Name, 
    [2] as Surname, 
    [3] as [character], 
    [4] as company 
from 
(
    select item, colnum, rn 
    from cte 
) src 
pivot 
(
    max(item) 
    for colnum in ([1], [2], [3], [4]) 
) piv 

請參閱SQL Fiddle with Demo

12

我在這裏假設有總是精確4個部分組成。

如果是這樣,您可以用.代替/並使用ParseName函數中的nice函數。從你的例子唯一的問題是,它從最終統計,所以你必須要小心你想要的部分:

DECLARE @test VARCHAR(max); 
SET @test = 'Peter/Parker/Spiderman/Marvel'; 
SET @test = Replace(@test, '/', '.'); 

SELECT Parsename(@test, 4),--returns Peter 
     Parsename(@test, 3),--returns Parker 
     Parsename(@test, 2),--returns Spiderman 
     Parsename(@test, 1) --returns Marvel 

如果有部件數量可變的,你需要找到一個字符串分割功能爲你做這個,沒有一個好的內置。許多選項可以發現搜索SO:https://stackoverflow.com/search?q=[sql+server]+string+split

Word的警告 - 如果您嘗試使用一個數字與PARSENAME非1- 4,結果將始終爲NULL。