我有一个类似于以下内容的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节点分成相应的列时遇到困难,如下所示:
我正在查看XML文档,并尝试使用不同的Sql Server XML方法,例如nodes和value,但遇到了麻烦。
我感觉好像是使用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行,然后从具有相同名称的元素中获取位置节点值。
并编写了以下代码示例:
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)
我得到的似乎是积极的结果。