А как насчет этого решения?
DECLARE @TourCodes VARCHAR(4000);
SET @TourCodes = ' AVG123 , JGH12,AVasfG123,JGsdfH12,AVsdgG123,JsdgGH12 , A34G123,J56gGH12, A34G1df23,JgfGH12';
with rcrs AS (
select rtrim(ltrim(LEFT(@TourCodes,charindex(',',@TourCodes)-1))) first,
SUBSTRING(@TourCodes+',',charindex(',',@TourCodes)+1,4000) other,
0 flg
union all
select rtrim(ltrim(LEFT(other,charindex(',',other)-1))) first,
SUBSTRING(other,charindex(',',other)+1,4000) other ,
flg+1 flg FROM rcrs WHERE charindex(',',other)>0
)
SELECT a.first one,b.first two from rcrs a
INNER JOIN rcrs b ON b.flg=a.flg+1 WHERE a.flg%2=0
В рекурсивном CTE строка разбивается с самого начала.
Следует отметить, что я добавил к исходной строке в первой части рекурсивного CTE дополнительный ','
. Это гарантирует, что все слова будут «съедены» CTE и затем могут быть обработаны основным выбором с использованием трюка по модулю (%
) для определения того, какая часть входит в столбец one
или two
.
Результат для этого примера:
one two
AVG123 JGH12
AVasfG123 JGsdfH12
AVsdgG123 JsdgGH12
A34G123 J56gGH12
A34G1df23 JgfGH12
См. демонстрацию здесь: http://rextester.com/WAA6224
Изменить
Очевидно, у меня было слишком много свободного времени ;-) ...
и поэтому я решил попробовать, смогу ли я на самом деле собрать весь материал в коллекцию из десяти столбцов, как того хочет ОП. . Я до сих пор не совсем понимаю, как должен был выглядеть результат, но вот еще один снимок:
DECLARE @TourCodes VARCHAR(4000);
SET @TourCodes = REPLACE(REPLACE(
' AVG123 , JGH12,AVasfG123,JGsdfH12,AVsdgG123,JsdgGH12 , A34G123,J56gGH12, A34G1df23,JgfGH12,
AVG1234 , JGH126,AVasfG1238,JGsdfH122,AVsdgG1235,JsdgGH127 , A34G1239,J56gGH12a, A34G1df23c,JgfGH12e,
AVG1235 , JGH127,AVasfG1239,JGsdfH123,AVsdgG1236,JsdgGH128 , A34G1230,J56gGH12b, A34G1df23d,JgfGH12f',
char(10),''),char(13),''); -- this is just a slightly extended sample input string
with rcrs AS (
select rtrim(ltrim(LEFT(@TourCodes,charindex(',',@TourCodes)-1))) first,
SUBSTRING(@TourCodes+',',charindex(',',@TourCodes)+1,4000) other, 0 flg
union all
select rtrim(ltrim(LEFT(other,charindex(',',other)-1))) first,
SUBSTRING(other,charindex(',',other)+1,4000) other , flg+1 flg FROM rcrs WHERE charindex(',',other)>0 and flg<30
), cmbn AS (
SELECT a.flg/20 ii,(a.flg/2)%10 ij ,a.first+','+b.first tc FROM rcrs a
LEFT JOIN rcrs b ON b.flg=a.flg+1
WHERE a.flg%2=0
)
SELECT ii,'ABC' name,'Amazon' org, MAX(CASE ij WHEN 0 THEN tc END) tc1,
MAX(CASE ij WHEN 1 THEN tc END) tc2,
MAX(CASE ij WHEN 2 THEN tc END) tc3,
MAX(CASE ij WHEN 3 THEN tc END) tc4,
MAX(CASE ij WHEN 4 THEN tc END) tc5,
MAX(CASE ij WHEN 5 THEN tc END) tc6,
MAX(CASE ij WHEN 6 THEN tc END) tc7,
MAX(CASE ij WHEN 7 THEN tc END) tc8,
MAX(CASE ij WHEN 8 THEN tc END) tc9,
MAX(CASE ij WHEN 9 THEN tc END) tc10
FROM cmbn GROUP BY ii
Результат выглядит следующим образом:
ii name org tc1 tc2 tc3 tc4 tc5 tc6 tc7 tc8 tc9 tc10
0 ABC Amazon AVG123,JGH12 AVasfG123,JGsdfH12 AVsdgG123,JsdgGH12 A34G123,J56gGH12 A34G1df23,JgfGH12 AVG1234,JGH126 AVasfG1238,JGsdfH122 AVsdgG1235,JsdgGH127 A34G1239,J56gGH12a A34G1df23c,JgfGH12e
1 ABC Amazon AVG1235,JGH127 AVasfG1239,JGsdfH123 AVsdgG1236,JsdgGH128 A34G1230,J56gGH12b A34G1df23d,JgfGH12f
см. здесь: http://rextester.com/ZJNV34690
Или, если вы хотите, чтобы все десять Tourcodes были в одном столбце, вы можете сделать
SELECT ii,'ABC' name,'Amazon' org,
MAX(CASE ij WHEN 0 THEN tc END)+' '+
COALESCE(MAX(CASE ij WHEN 1 THEN tc END)+' ','')+
COALESCE(MAX(CASE ij WHEN 2 THEN tc END)+' ','')+
COALESCE(MAX(CASE ij WHEN 3 THEN tc END)+' ','')+
COALESCE(MAX(CASE ij WHEN 4 THEN tc END)+' ','')+
COALESCE(MAX(CASE ij WHEN 5 THEN tc END)+' ','')+
COALESCE(MAX(CASE ij WHEN 6 THEN tc END)+' ','')+
COALESCE(MAX(CASE ij WHEN 7 THEN tc END)+' ','')+
COALESCE(MAX(CASE ij WHEN 8 THEN tc END)+' ','')+
COALESCE(MAX(CASE ij WHEN 9 THEN tc END)+' ','') tourCodes
FROM cmbn GROUP BY ii
в основном выберите. См. здесь http://rextester.com/AQCG28977
результат:
ii name org tourCodes
0 ABC Amazon AVG123,JGH12 AVasfG123,JGsdfH12 AVsdgG123,JsdgGH12 A34G123,J56gGH12 A34G1df23,JgfGH12 AVG1234,JGH126 AVasfG1238,JGsdfH122 AVsdgG1235,JsdgGH127 A34G1239,J56gGH12a A34G1df23c,JgfGH12e
1 ABC Amazon AVG1235,JGH127 AVasfG1239,JGsdfH123 AVsdgG1236,JsdgGH128 A34G1230,J56gGH12b A34G1df23d,JgfGH12f
person
Carsten Massmann
schedule
20.06.2017
string_split()
. - person Carsten Massmann   schedule 20.06.2017