将单个逗号分隔的行转换为多行

Posted

技术标签:

【中文标题】将单个逗号分隔的行转换为多行【英文标题】:Converting a single comma separated row into multiple rows 【发布时间】:2019-11-15 13:24:27 【问题描述】:

我正在尝试使用此查询将单个逗号分隔的行(列)转换为多行:

SELECT 
    Split.a.value('.', 'VARCHAR(max)') AS String  
FROM  
    (SELECT 
         CAST ('<M>' + REPLACE(cast([csvdata] as Varchar(max)), ',', '</M><M>') + '</M>' AS XML) AS String  
     FROM  
         tboutbound 
     WHERE 
         id = '30') AS A 
CROSS APPLY 
    String.nodes ('/M') AS Split(a);

但我得到一个错误:

“XML 解析:第 2 行,字符 36,非法名称字符”

无法更新表和更改数据?

有什么建议吗?

【问题讨论】:

csv 数据是什么样的?您使用的是什么版本的 SQL Server? 最好的建议是存储此类文本。加载数据时处理文本并将其正确存储在单独的列中。在 SQL Server 2016 及更高版本中,您可以使用 STRING_SPLIT。最好还是设计好表格,在加载的时候拆分数据,而不是在已经入库之后 @SalmanA 无法在此处粘贴数据,但数据包含空格、撇号 ( 's) 并且可能包含一些特殊字符。 @PanagiotisKanavos 无法更改数据存储方法。我没有使用 SQL Server 2016。 @SalmanA 我使用的是 SQL Server 2014(版本 12.0.6108.1) 【参考方案1】:

假设(希望)数据不包含序列&lt;![CDATA[]]&gt;,您可以这样做:

SELECT CAST('<M><![CDATA[' + REPLACE([csvdata], ',', ']]></M><M><![CDATA[') + ']]></M>' AS XML)
FROM t

https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=0409a8643577a8b88e326689ab6da5a7

【讨论】:

或者像这样转义文本:. . . REPLACE( (select csvdata for xml path(''), type), ',',', ' . . . 谢谢大卫。来自 DB 小提琴的查询给出了一些结果,但这不是我所期望的。该查询将一列转换为多行,但其再次值仅在一列中出现。例如我有一列和一行正在转换为 1 列和 2000 行。结果应该是 26 列,多行。

以上是关于将单个逗号分隔的行转换为多行的主要内容,如果未能解决你的问题,请参考以下文章

将多行转换为雪花中的一个逗号分隔值

将逗号分隔的单元格拆分为多行,保持原始行不变?

Python将数据框转换为逗号分隔的行[重复]

将逗号分隔的字符串转换为单独的行

如何将逗号分隔值转换为oracle中的行?

使用逗号分隔符将单个 CSV 列批量转换为多个