目前我的记录如下。一个完整的记录按管道|
拆分,数据用逗号分隔。
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
如何将记录拆分为:
C1 C2 C3
123 870503-23-5370 021
456 830503-23-5371 031
789 870103-11-5372 041
......
答案 0 :(得分:3)
这种操作应该在应用层完成。
快速解决方法使用基于|
分割的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'
使用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;
答案 1 :(得分:1)
另一种方法可以简单地将数据导出到csv文件(您可以通过管理工作室轻松完成),然后通过指定字段和记录分隔符使用BULK INSERT加载该csv文件。有关如何执行此操作的详细说明,请访问:bulk insert csv