2011-05-05 46 views
1

我試圖從一列取數據字符串並將其分成幾個不同的列。問題是我需要使用空格('')作爲分隔符,我不知道如何?此外,我需要將案例陳述(我假設)合併,以便與其他區域中的子字符串分離。SQL Server 2008初學者腳本問題:使用子字符串和分支語句的分隔字符串

範例:名稱帳戶445566 0010020056893010445478008 AFD 369 我可以使用空格作爲分隔符,直到001002 ...數據字符串的點。這必須進一步細分。另外,如果我用空格作爲分隔符,當我用多個空格命中某個區域時,我該如何避免出現空列?

回答

0

這裏有一個分解表的功能:

CREATE FUNCTION [dbo].[Split] 
( 
@String varchar(max) 
,@Delimiter char 
) 
RETURNS @Results table 
(
Ordinal int 
,StringValue varchar(max) 
) 
as 
begin 

    set @String = isnull(@String,'') 
    set @Delimiter = isnull(@Delimiter,'') 

    declare 
    @TempString varchar(max) = @String 
    ,@Ordinal int = 0 
    ,@CharIndex int = 0 

    set @CharIndex = charindex(@Delimiter, @TempString) 
    while @CharIndex != 0 begin  
     set @Ordinal += 1  
     insert @Results values 
     (
     @Ordinal 
     ,substring(@TempString, 0, @CharIndex) 
     )  
     set @TempString = substring(@TempString, @CharIndex + 1, len(@TempString) - @CharIndex)  
     set @CharIndex = charindex(@Delimiter, @TempString) 
    end 

    if @TempString != '' begin 
     set @Ordinal += 1 
     insert @Results values 
     (
     @Ordinal 
     ,@TempString 
     ) 
    end 

    return 
end 

用法:

select 
s.* 
from dbo.Split('445566   0010020056893010445478008 AFD 369', ' ') as s 
where s.StringValue != '' -- this condition will drop your extra spaces 

產量:

Ordinal StringValue 
1 445566 
11 0010020056893010445478008 
12 AFD 
13 369

,您可以根據需要進一步細分。

+1

太棒了!太棒了。謝謝! – 2boolORNOT2bool 2011-05-05 21:07:35

+0

沒問題......;) – canon 2011-05-06 13:17:28

+0

我怎麼能這個函數分裂成行而不是一列? – 2boolORNOT2bool 2011-05-11 18:08:27