2011-01-10 30 views
1

私は以下のようなデータセット(入力)を持っています。SQL Server 2008分割文字列レコード内

IR# CR# 
1  1,2 
2  3 
3  4,5,6 

次の出力を希望します。この例では、すべてのフィールドをvarcharと見なすことができます。

IR# CR# 
1  1 
1  2 
2  3 
3  4 
3  5 
3  6 

私はUDFの行にCSV文字列を分割する必要が...ではなく、何かが、その後組合意志の次の行を複数の行に表に1行を分割する など

ありがとう!

答えて

1

分割したUDFと組み合わせてCROSS APPLYを使用してください。私の例で使用している文字列分割器はhereです。

/* Create function for purposes of demo */ 
CREATE FUNCTION [dbo].[fnParseStringTSQL] (@string NVARCHAR(MAX),@separator NCHAR(1)) 
RETURNS @parsedString TABLE (string NVARCHAR(MAX)) 
AS 
BEGIN 
    DECLARE @position int 
    SET @position = 1 
    SET @string = @string + @separator 
    WHILE charindex(@separator,@string,@position) <> 0 
     BEGIN 
     INSERT into @parsedString 
     SELECT substring(@string, @position, charindex(@separator,@string,@position) - @position) 
     SET @position = charindex(@separator,@string,@position) + 1 
     END 
    RETURN 
END 
go 

/* Set up sample data */ 
declare @t table (
    IR int, 
    CR varchar(100) 
) 

insert into @t 
    (IR, CR) 
    select 1, '1,2' union all 
    select 2, '3' union all 
    select 3, '4,5,6' 

/* Here's the query that solves the problem */ 
select t.IR, p.string 
    from @t t 
     cross apply [dbo].[fnParseStringTSQL](t.CR,',') p 


/* clean up after demo */ 
drop function [dbo].[fnParseStringTSQL] 
+0

素晴らしいです。ありがとう。私はより多くを適用するクロスを見てする必要があります! – thomas

+1

もちろん、これは、不正な形式のデータを継続的に使用しないように、データをリレーショナルモデルに変換する場合にのみ行う必要があります。これを行う必要性は、緊急に再設計する必要性を示している。 – HLGEM

+0

@HLGEM:アーメン。 –