Odpowiedź na to może być łatwiejsza, gdybyśmy mogli zobaczyć twoją funkcję split string. Moja odpowiedź dotyczy wersji mojej funkcji podziału, którą posiadam.
Dołączyłbym do twojej funkcji podziału numer wiersza, którego możesz użyć do JOIN podzielonego ciągu i podzielonych wartości.
Funkcja podziału:
CREATE FUNCTION [dbo].[Split](@String varchar(MAX), @Delimiter char(1))
returns @temptable TABLE (items varchar(MAX), rn int)
as
begin
declare @idx int
declare @slice varchar(8000)
declare @rn int = 1 -- row number that increments with each value in the delimited string
select @idx = 1
if len(@String)<1 or @String is null return
while @idx!= 0
begin
set @idx = charindex(@Delimiter,@String)
if @idx!=0
set @slice = left(@String,@idx - 1)
else
set @slice = @String
if(len(@slice)>0)
insert into @temptable(Items, rn) values(@slice, @rn)
set @String = right(@String,len(@String) - @idx)
set @rn = @rn +1
if len(@String) = 0 break
end
return
end;
Następnie, jeśli masz wiele kolumn do podzielenia, możesz użyć zapytania podobnego do następującego:
INSERT INTO dbo.tblSplitData(SplitKey, SplitString, SplitValues)
select s.rawkey,
s.splitstring,
v.splitvalues
from
(
SELECT d.RawKey, d.delimitedstring, d.delimitedvalues,
c.items SplitString,
c.rn
FROM dbo.tblRawData d
CROSS APPLY dbo.Split(d.DelimitedString, ',') c
) s
inner join
(
SELECT d.RawKey, d.delimitedstring, d.delimitedvalues,
c.items SplitValues,
c.rn
FROM dbo.tblRawData d
CROSS APPLY dbo.Split(d.DelimitedValues, ',') c
) v
on s.rawkey = v.rawkey
and s.delimitedstring = v.delimitedstring
and s.rn = v.rn;
Zobacz SQL Fiddle z wersją demonstracyjną
Wykorzystuje to dwa podzapytania, które generują listę wartości dzielonych, a następnie są one łączone przy użyciu numeru wiersza utworzonego przez funkcję podziału.