Этот вид операции должно быть сделано в прикладном уровне.
Быстрый обходной uisng XML, чтобы разделить на основе |
:
declare @S varchar(1000) = '123,870503-23-5370,021|456,830503-23-5371,031|789,870103-11-5372,041|654,870501-23-5373,051|321,880503-12-5374,061|987,870803-23-5375,071|109,870508-06-5376,081|174,810503-03-5377,091|509,870103-01-5378,101|687,870501-12-5379,131'
Spliting для каждого столбца с помощью PARSENAME
:
;WITH cte AS
(
select
REPLACE(n.r.value('.', 'varchar(500)'), ',','.') As c
from (select cast('<r>'+replace(@S, '|', '</r><r>')+'</r>' as xml)) as s(XMLCol)
cross apply s.XMLCol.nodes('r') as n(r)
)
SELECT PARSENAME(c,3) AS col1,
PARSENAME(c,2) AS col2,
PARSENAME(c,1) AS col3
FROM cte;
LiveDemo
Выход:
╔══════╦════════════════╦══════╗
║ col1 ║ col2 ║ col3 ║
╠══════╬════════════════╬══════╣
║ 123 ║ 870503-23-5370 ║ 021 ║
║ 456 ║ 830503-23-5371 ║ 031 ║
║ 789 ║ 870103-11-5372 ║ 041 ║
║ 654 ║ 870501-23-5373 ║ 051 ║
║ 321 ║ 880503-12-5374 ║ 061 ║
║ 987 ║ 870803-23-5375 ║ 071 ║
║ 109 ║ 870508-06-5376 ║ 081 ║
║ 174 ║ 810503-03-5377 ║ 091 ║
║ 509 ║ 870103-01-5378 ║ 101 ║
║ 687 ║ 870501-12-5379 ║ 131 ║
╚══════╩════════════════╩══════╝
Предупреждение:
Использование XML может вызвать проблемы, когда ваша строка содержит некоторые символы, такие как <&'">
.
PARSENAME
Используется для быстрого разделения до 4 ломтиков. Работает только с данными, которые не содержат символ .
.
EDIT:
Установка очень проста:
;WITH cte AS
(
select
REPLACE(n.r.value('.', 'varchar(500)'), ',','.') As c
from (select cast('<r>'+replace(@S, '|', '</r><r>')+'</r>' as xml)) as s(XMLCol)
cross apply s.XMLCol.nodes('r') as n(r)
)
INSERT INTO your_table(col1, col2, col3)
SELECT PARSENAME(c,3) AS col1,
PARSENAME(c,2) AS col2,
PARSENAME(c,1) AS col3
FROM cte;
Первое ограничение может быть выполнено с использованием метода «Значение» –
Спасибо, lad2025 за быстрый ответ. Ваш скрипт работает. Можете ли вы расширить, чтобы я мог вставить результаты в базу данных. – SiChiPan
@SiChiPan использовать [INSERT] (https://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k (INSERT_TSQL); k (SQL11.SWB.TSQLRESULTS.F1); k (SQL11.SWB.TSQLQUERY.F1); k (MISCELLANEOUSFILESPROJECT); k (DevLang-TSQL) & rd = true) для этого –