将XML对象解析为行,并从具有相同名称的相同级别的节点获取值-SQL Server [重复]

问题描述 投票:0回答:1

我有一个类似于以下内容的xml文档结构

<X>
    <Y>Noah</Y>
    <Y>111 Fake St</Y>
    <Y>888-555-5555</Y>
</X>
<X>
    <Y>Jonh</Y>
    <Y>123 Jump St</Y>
    <Y>888-500-5000</Y>
</X>
<X>
   .
   .
   .
</X>

上面是表格列code_xml中一行数据的示例

我在弄清楚如何将X节点分成单独的行并使Y节点分成相应的列时遇到困难,如下所示:

enter image description here

我正在查看XML文档,并尝试使用不同的Sql Server XML方法,例如nodesvalue,但遇到了麻烦。

我感觉好像是使用nodes函数使用交叉应用来分解每个内部X元素,然后对Y元素使用value方法及其适当的位置值把戏。

我失败了,因为我没有使用正确的点符号,如下所示:

select 
    d.p.value('./Y[1]', 'varchar(200)') Name,
    p.value('./Y[2]', 'varchar(200)') Address,
    p.value('./Y[3]', 'varchar(200)') Phone
from
    T
cross apply 
    T.Code_xml.nodes('/X') as d(p)

然后我找到了这个Stack Overflow post,并帮助我解决了问题。

sql-server xml xml-parsing
1个回答
0
投票

下面是一个很好的工作示例,说明如何解决将一行中的多个节点转换成多个sql行,然后从具有相同名称的元素中获取位置节点值。

并编写了以下代码示例:

declare @xml nvarchar(max) = '<X>
    <Y>Noah</Y>
    <Y>111 Fake St</Y>
    <Y>888-555-5555</Y>
</X>
<X>
    <Y>Jonh</Y>
    <Y>123 Jump St</Y>
    <Y>888-500-5000</Y>
</X>'

select d.p.value('./Y[1]', 'varchar(200)') Name
,d.p.value('./Y[2]', 'varchar(200)') Address
,d.p.value('./Y[3]', 'varchar(200)') Phone
from (select CAST(@xml as XML) as Code_xml) T
cross apply T.Code_xml.nodes('/X') as d(p)

我得到的似乎是积极的结果。

© www.soinside.com 2019 - 2024. All rights reserved.