Вы можете сначала нормализовать ваши данные, используя новую функцию STRING_SPLIT
, в производную таблицу с разделенными столбцами, вытянутыми вниз. Используя эту таблицу, вы можете PIVOT на основе Col1 создать 5 столбцов, которые в основном возвращают данные, которые были ранее разделены. Затем используйте эти данные в качестве источника для обновления обратно к исходной таблице.
Если вы не используете SQL Server 2016, вам нужно заменить STRING_SPLIT
на анализатор табличных функций с разделителями.
DECLARE @T TABLE(Col1 INT, Col2 NVARCHAR(50), Col3 NVARCHAR(50), Col4 NVARCHAR(50), Col5 NVARCHAR(50))
INSERT @T (COl1,Col2) VALUES (1,'12345678|87654321|11111111|22222222|')
INSERT @T (COl1,Col2) VALUES (2,'12345678')
INSERT @T (COl1,Col2) VALUES (3,'12345678|87654321|')
SELECT * FROM @T
;
WITH SplitData AS
(
SELECT
Col1,Col2 = S.Value,
RN = ROW_NUMBER()OVER( PARTITION BY Col1 ORDER BY (SELECT 1 AS X))
FROM
@T
CROSS APPLY STRING_SPLIT(Col2,'|') S
)
,UpdateData AS
(
SELECT
Col1, Col2=[1], Col3=[2], Col4=[3], Col5=[4]
FROM
(
SELECT Col1, Col2, RN FROM SplitData
) AS S
PIVOT(
MAX(Col2) FOR RN IN ([1], [2], [3], [4], [5])
) AS P
)
UPDATE L
SET L.Col1 = R.Col1, L.Col2=R.Col2, L.Col3=R.Col3, L.Col4=R.Col4, L.Col5 = R.Col5
FROM
@T L
INNER JOIN UpdateData R ON L.Col1 = R.Col1
SELECT * FROM @T