2011-01-10 5 views
1

У меня есть набор данных, который выглядит следующим образом (вход).SQL Server 2008 Split String From Field In Record

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 

У меня есть UDFs разбить строку CSV в строки ... но не то, чтобы разделить 1 строку в таблице на несколько строк, а затем союз будет следующий ряд и т.д.

Спасибо!

ответ

1

Используйте CROSS APPLY в сочетании с вашим раздельным UDF. Сплиттер строк, который я использую для моего примера, исходит от 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

awesome. Благодарю. Мне нужно смотреть на крест, чтобы применить больше! – thomas

+1

Конечно, это должно быть сделано только для того, чтобы преобразовать данные в реляционную модель, чтобы не использовать постоянно на плохо сформированных данных. Необходимость сделать это указывает на необходимость срочной перестройки. – HLGEM

+0

@HLGEM: Аминь к этому. –