Если я правильно понимаю требование, это предельно просто.Нет необходимости в разделении или другом типе функции, динамическом SQL, рекурсивных CTE, PIVOTING или любой другой skulduggery.
Для выполнения «разделения» вы можете использовать CROSS APPLY
, например, так:
SELECT
Pat,
Codes,
C1 = SUBSTRING(Codes,1,ISNULL(d1.d-1,8000)),
C2 = SUBSTRING(Codes,d1.d+1, d2.d-d1.d-1),
C3 = SUBSTRING(Codes,d2.d+1, d3.d-d2.d-1),
C4 = SUBSTRING(Codes,d3.d+1, d4.d-d3.d-1),
C5 = SUBSTRING(Codes,d4.d+1, 8000)
FROM _Table
CROSS APPLY (VALUES (NULLIF(CHARINDEX(',',Codes),0))) d1(d)
CROSS APPLY (VALUES (NULLIF(CHARINDEX(',',Codes,d1.d+1),0))) d2(d)
CROSS APPLY (VALUES (NULLIF(CHARINDEX(',',Codes,d2.d+1),0))) d3(d)
CROSS APPLY (VALUES (NULLIF(CHARINDEX(',',Codes,d3.d+1),0))) d4(d);
Возвращает
Pat Codes C1 C2 C3 C4 C5
-------- ----------------------------- ----- ------ ----- ----- ------
Pat1 U212,Y973,Y982 U212 Y973 NULL NULL NULL
Pat2 M653 M653 NULL NULL NULL NULL
Pat3 U212,Y973,Y983,Z924,Z926 U212 Y973 Y983 Z924 Z926
Обратите внимание на супер-простой и очень эффективный план выполнения:
Вы можете упростить это еще больше, если коды всегда состоят из четырех символов, например:
SELECT
Pat,
Codes,
C1 = NULLIF(SUBSTRING(Codes,1,4),''),
C2 = NULLIF(SUBSTRING(Codes,6,4),''),
C3 = NULLIF(SUBSTRING(Codes,11,4),''),
C4 = NULLIF(SUBSTRING(Codes,16,4),''),
C2 = NULLIF(SUBSTRING(Codes,21,4),'')
FROM _Table;
Чтобы выполнить обновление, вы должны сделать это для первого решения:
UPDATE _Table
SET
C1 = SUBSTRING(Codes,1,ISNULL(d1.d-1,8000)),
C2 = SUBSTRING(Codes,d1.d+1, d2.d-d1.d-1),
C3 = SUBSTRING(Codes,d2.d+1, d3.d-d2.d-1),
C4 = SUBSTRING(Codes,d3.d+1, d4.d-d3.d-1),
C5 = SUBSTRING(Codes,d4.d+1, 8000)
FROM _Table
CROSS APPLY (VALUES (NULLIF(CHARINDEX(',',Codes),0))) d1(d)
CROSS APPLY (VALUES (NULLIF(CHARINDEX(',',Codes,d1.d+1),0))) d2(d)
CROSS APPLY (VALUES (NULLIF(CHARINDEX(',',Codes,d2.d+1),0))) d3(d)
CROSS APPLY (VALUES (NULLIF(CHARINDEX(',',Codes,d3.d+1),0))) d4(d);
Если сновакоды состоят всего из четырех символов, тогда обновление так просто, что кажется обманом:
UPDATE _Table
SET C1 = NULLIF(SUBSTRING(Codes,1,4),''),
C2 = NULLIF(SUBSTRING(Codes,6,4),''),
C3 = NULLIF(SUBSTRING(Codes,11,4),''),
C4 = NULLIF(SUBSTRING(Codes,16,4),''),
C5 = NULLIF(SUBSTRING(Codes,21,4),'');