这种操作应该在应用层进行。
使用基于| 拆分的快速解决方法:
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'
使用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 个切片。仅适用于不包含 . 字符的数据。
编辑:
插入非常简单:
;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;