MSSQL 2012将记录分成多行

时间:2015-12-07 09:43:19

标签: sql sql-server tsql stored-procedures sql-server-2012

目前我的记录如下。一个完整的记录按管道|拆分,数据用逗号分隔。

 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
......

2 个答案:

答案 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