2015-04-05 49 views
-3

我想分割功能像兩個單獨的列與給定的輸入字符串。分割函數逗號分隔符SQL Server

如果我執行這個功能,我得到行的值列表像

select * 
from dbo.Split ('sunday,9,monday,8,tuesday,9, wednesday 8, thursday 8,friday,9, saturday,8') 

輸出像行值

sunday 
9 
monday 
8 
tuesday 
9 
wednesday 
8 
thursday 
8 
friday 
9 
saturday 
8 

我分割功能是:

create function dbo.Split 
(
    @String varchar(max) 
) 
returns @SplittedValues table 
(
    Id varchar(50) 
) 
as 
begin 
    declare @SplitLength int, @Delimiter varchar(5) 

    set @Delimiter = ',' 

    while len(@String) > 0 
    begin 
     select @SplitLength = (case charindex(@Delimiter,@String) when 0 then 
      len(@String) else charindex(@Delimiter,@String) -1 end) 

     insert into @SplittedValues 
     select substring(@String,1,@SplitLength) 

     select @String = (case (len(@String) - @SplitLength) when 0 then '' 
      else right(@String, len(@String) - @SplitLength - 1) end) 
    end 
return 
end 

但我需要輸出像兩列天(列表中的第一個參數),小時,

+-----------+-------+ 
| Days | Hours | 
+-----------+-------+ 
| Sunday | 9 | 
| Monday | 8 | 
| Tuesday | 9 | 
| Wednesday | 8 | 
| Thursday | 8 | 
| Friday | 9 | 
| saturday | 8 | 
+-----------+-------+ 

我該如何解決這個問題?

+1

在這裏查看各種方法,將CSV轉換爲行,並進行性能比較 – 2015-04-05 02:47:23

+0

@Fireblade check where?我沒有看到鏈接 – 2015-04-05 03:51:39

+0

@ t-clausen.dk - 哎呀錯過添加鏈接http://sqlperformance.com/2012/07/t-sql-queries/split-strings – 2015-04-05 04:15:06

回答

0

可能有更漂亮的方法來做到這一點。

create function dbo.TwoColumnSplit 
(
    @String varchar(max) 
) 
returns @returnTable table 
(
    LeftId varchar(50) 
    , RightId varchar(50) 
) 
as 
begin 

declare @numCols int = 2 
declare @itr int = 0 
declare @SplittedValues table 
(
    rowID int, 
    colID int, 
    Id varchar(50) 

) 
    declare @SplitLength int, @Delimiter varchar(5) 

    set @Delimiter = ',' 

    while len(@String) > 0 
    begin 
     select @SplitLength = (case charindex(@Delimiter,@String) when 0 then 
      len(@String) else charindex(@Delimiter,@String) -1 end) 

     insert into @SplittedValues(rowID, colID, Id) 
     select @itr/@numCols, @itr % @numCols, substring(@String,1,@SplitLength) 

     select @String = (case (len(@String) - @SplitLength) when 0 then '' 
      else right(@String, len(@String) - @SplitLength - 1) end) 

     set @itr = @itr + 1 
    end 

insert into @returnTable(LeftId, RightId) 
select l.id as LeftId, r.id as RightId 
from 
(select rowid, id from @SplittedValues where colid = 0) l 
join 
(select rowid, id from @SplittedValues where colid = 1) r 
on l.rowid = r.rowID 

return 
END 

go 

select * from [dbo].[TwoColumnSplit]('sunday,9,monday,8,tuesday,9, wednesday, 8, thursday, 8,friday,9, saturday,8') 
+0

我有另一種情況,需要拆分爲4列,你能幫助最後的加入聲明。 http://stackoverflow.com/questions/29471301/split-function-comma-separator-four-columns-sql-server – user3442289 2015-04-06 12:26:22

1

@ user3442289您也可以使用下面的代碼。我剛剛修改了代碼中的幾條語句。

create function dbo.Split2 
(
    @String varchar(max) 
) 
returns @SplittedValues table 
(
    Id varchar(50) , 
    Id1 int 
) 

begin 
    declare @SplitLength int, @Delimiter varchar(5) 

    set @Delimiter = ',' 

    while len(@String) > 0 
    begin 
     select @SplitLength = (case charindex(@Delimiter,@String) when 0 then 
      len(@String) else charindex(@Delimiter,@String) end) 

     insert into @SplittedValues 
     select substring(@String,1,@SplitLength-1) ,SUBSTRING(@string,@SplitLength+1,1) 

       select @String = (case (len(@String) - @SplitLength) when 0 then '' 
      else right(@String, len(@String) - @SplitLength-1) end) 

      if @string<>'' 
      begin 
      set @string=(select substring(@string,2,len(@string))) 
      end 

    end 
    return 
end 
+0

嘿,這是一個比我的更好的策略:) – Greenspark 2015-04-06 03:42:00