将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中一行数据的示例

我在弄清楚如何将这些xml X对象分解为单独的行并将Y放入其合适的列中时遇到麻烦,如下所示:

enter image description here

我正在查看XML文档,并尝试使用诸如value之类的不同功能,但是遇到了麻烦。

我感觉好像使用nodes函数使用交叉应用来分解每个内部X元素,然后对Y元素使用值函数及其适当的位置值就可以解决问题。

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

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行,然后从具有相同名称的元素中获取位置节点值。

并编写了以下代码示例:

if OBJECT_ID(N'T',N'U') IS NOT NULL
DROP TABLE T
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 cast(@Xml as xml) Code_XML
into T

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 T
cross apply T.Code_xml.nodes('/X') as d(p)

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

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