将单个逗号分隔的行转换为多行
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】:假设(希望)数据不包含序列<![CDATA[
和]]>
,您可以这样做:
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 列,多行。以上是关于将单个逗号分隔的行转换为多行的主要内容,如果未能解决你的问题,请参考以下文章