Один из возможных подходов - разделить тексты в столбцах [Вариант описания] и [Порядок вариантов] и обновить таблицу динамическим оператором.
Хотя использование STRING_SPLIT()
является первым выбором, начиная с SQL Server 2016, в этом случае эта функция не является опцией, поскольку порядок подстрок не гарантируется.
Рабочим решением является использование OPENJSON()
- значения столбцов преобразуются в действительный объект JSON
(например, 'NAVY/44'
переводится в '["NAVY", "44"]'
), а подстроки извлекаются с использованием OPENJSON()
.
Введите:
CREATE TABLE #Data (
[Item] varchar(10),
[Variant Descr.] varchar(50),
[Variant Order] varchar(50),
[Dim_Colour] varchar(50),
[Dim_Size] varchar(50),
[Dim_Style] varchar(50)
)
INSERT INTO #Data
([Item], [Variant Descr.], [Variant Order], [Dim_Colour], [Dim_Size], [Dim_Style])
VALUES
('01', 'NAVY/44', 'COLOUR/SIZE', NULL, NULL, NULL),
('02', 'BLACK/S4', 'COLOUR/STYLE', NULL, NULL, NULL),
('03', 'NAVY/44/S4', 'COLOUR/SIZE/STYLE', NULL, NULL, NULL),
('04', 'GREEN', 'COLOUR', NULL, NULL, NULL)
T-SQL:
-- Dynamic statement
DECLARE @stm nvarchar(max) = N''
SELECT @stm = @stm +
N'UPDATE #Data ' +
N'SET ' +
QUOTENAME('Dim_' + j1.[value]) +
N' = ''' +
j2.[value] +
N''' WHERE Item = ''' +
d.Item +
N'''; '
FROM #Data d
CROSS APPLY OPENJSON(CONCAT('["', REPLACE([Variant Order], '/', '","'), '"]')) j1
CROSS APPLY OPENJSON(CONCAT('["', REPLACE([Variant Descr.], '/', '","'), '"]')) j2
WHERE j1.[key] = j2.[key]
-- Execution and output
EXEC (@stm)
SELECT *
FROM #Data
Выход:
-----------------------------------------------------------------------------
Item Variant Descr. Variant Order Dim_Colour Dim_Size Dim_Style
-----------------------------------------------------------------------------
01 NAVY/44 COLOUR/SIZE NAVY 44
02 BLACK/S4 COLOUR/STYLE BLACK S4
03 NAVY/44/S4 COLOUR/SIZE/STYLE NAVY 44 S4
04 GREEN COLOUR GREEN