如何从离散的 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XSLT 从 XML 中删除元素标记

如何使用 C# ASP.Net 从 XML 文档中获取特定 XML 元素的列表?

如何单击元素并从链接的 xml 文件(python)中解析文本?

如何从联合、离散、概率分布函数中进行数值采样

XSLT / Muenchian 分组:如何从组中选择具有某些子元素的元素?

如何在 plsql 的 varchar2 字段中的 xml 节点末尾插入“1”?