Другой возможный подход заключается в подсчете запятых:
Ввод:
CREATE TABLE #Data (
a_value varchar(max)
)
INSERT INTO #Data
(a_value)
VALUES
('(6, 5, 1908, 650)'),
('(16, 21, 3002, 110)'),
('(-228,117,29,335,279,700,000,000,000,000,000,000,000,000)'),
('(-387,150,276,186,008)'),
(NULL)
T-SQL:
SELECT
CASE
WHEN LEN(a_value) - LEN(REPLACE(a_value, ',', '')) = 3
THEN PARSENAME(REPLACE(SUBSTRING(a_value, 2, LEN(a_value) -2), ',', '.'), 4)
ELSE NULL
END AS w1,
CASE
WHEN LEN(a_value) - LEN(REPLACE(a_value, ',', '')) = 3
THEN PARSENAME(REPLACE(SUBSTRING(a_value, 2, LEN(a_value) -2), ',', '.'), 3)
ELSE NULL
END AS w2,
CASE
WHEN LEN(a_value) - LEN(REPLACE(a_value, ',', '')) = 3
THEN PARSENAME(REPLACE(SUBSTRING(a_value, 2, LEN(a_value) -2), ',', '.'), 2)
ELSE NULL
END AS w3,
CASE
WHEN LEN(a_value) - LEN(REPLACE(a_value, ',', '')) = 3
THEN PARSENAME(REPLACE(SUBSTRING(a_value, 2, LEN(a_value) -2), ',', '.'), 1)
ELSE NULL
END AS w4,
CASE
WHEN LEN(a_value) - LEN(REPLACE(a_value, ',', '')) = 3
THEN NULL
ELSE a_value
END AS w5
FROM
#Data
Выход:
----------------------------------------------------------------------------------------
w1 w2 w3 w4 w5
----------------------------------------------------------------------------------------
6 5 1908 650 NULL
16 21 3002 110 NULL
NULL NULL NULL NULL (-228,117,29,335,279,700,000,000,000,000,000,000,000,000)
NULL NULL NULL NULL (-387,150,276,186,008)
NULL NULL NULL NULL NULL