Може би ще бъде по-лесно да отговорим на този въпрос, ако можем да видим вашата функция за разделен низ. Моят отговор е да използвам версия на моята функция за разделяне, която имам.
Бих включил във вашата функция за разделяне номер на ред, който можете да използвате, за да ПРИСЪЕДИНИТЕ разделения низ и разделените стойности.
Функция за разделяне:
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;
След това, ако имате няколко колони за разделяне, можете да използвате заявка, подобна на следната:
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;
Вижте SQL Fiddle с демонстрация
Това използва две подзаявки, които генерират списъка с разделени стойности, след което те се обединяват с помощта на номера на реда, създаден от функцията за разделяне.