2011-01-10 5 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

분할 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 : 아멘. –