如何从离散的 varchar 元素中选择 xml?
Posted
技术标签:
【中文标题】如何从离散的 varchar 元素中选择 xml?【英文标题】:How to select as xml from discrete varchar elements? 【发布时间】:2017-06-20 02:34:37 【问题描述】:我有一个旧的 SQL Server 表,它有一个 varchar(2056)
列,其中每一行都包含 XML 的谨慎“元素”。有没有办法使用 T-SQL 将这些选择成真正的 XML?
这将使您了解我正在处理的内容:
declare @xmlTable table(
Value varchar(2056)
)
insert into @xmlTable
values ( '<Root>' ),
( ' <Child id="1">' ),
( ' <Name>Sam</Name>' ),
( ' </Child>' ),
( ' <Child />' ),
( '</Root>' )
问题是每个元素都在表格中的自己的行中,并且打开/关闭标签可以相隔几行。我尝试转换为 XML,但由于每一行都不是有效的 xml,因此失败了。我也尝试过旧的“select column to CSV using for XML”技巧(创建一个我可以转换的字符串),但这会将我的“>”转换为“>”等等
我使用的是 SQL Server 2012,这个特定的表有超过 650k 行分布在 560 个“文档”中。我希望能够这样说:
select Value
from @xmlTable
for xml path( '' ), type
并返回漂亮的可查询 XML 块。
谢谢!
【问题讨论】:
哎呀!我使用的是 sql 2012,而不是 2014。 【参考方案1】:试试这样:
declare @xmlTable table(
Value varchar(2056)
)
insert into @xmlTable
values ( '<Root>' ),
( ' <Child id="1">' ),
( ' <Name>Sam</Name>' ),
( ' </Child>' ),
( ' <Child />' ),
( '</Root>' );
SELECT CAST
(
(
SELECT Value AS [*]
FROM @xmlTable
FOR XML PATH(''),TYPE
).value('.','nvarchar(max)')
AS XML);
使用,TYPE
和之后的value()
方法解决了字符串和包含的转义实体的问题。这样做,所有转义字符都会被隐式重新转义。
【讨论】:
是的,这行得通!至少在样本数据上,我很快就会在大数据上进行尝试。大数据都是 CDATA[] 的东西,希望不会引起问题。我从未见过“作为[*]”。那到底是在做什么? @emery.noel 1)CDATA
-sections 不会打扰,但会被翻译成通常转义的部分。这应该没什么区别... 2) as [*]
是强制执行未命名列的众多方法之一。否则生成的 XML 将包含命名元素 3) 感谢您的接受!只是一个小小的提示:如果你喜欢这个,你可以另外投票给答案。投票和接受是 SO...快乐编码的两个不同步骤!
哈哈,我点击得太快了。现在投票了。摆脱 CDATA 只是一个额外的好处。这在我们最新的“文档”上完美运行......现在看看我是否可以一次获得它们!再次感谢!以上是关于如何从离散的 varchar 元素中选择 xml?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 C# ASP.Net 从 XML 文档中获取特定 XML 元素的列表?
如何单击元素并从链接的 xml 文件(python)中解析文本?