使用T-SQL中的其他字段读取XML

时间:2014-07-24 00:06:56

标签: sql xml

让我们说我有一个包含以下列的表:

EmpID, EmpName, PHONEXML

使用PHONEXML赞:

<phoneType>Home</phoneType>
<phoneNum>123456789</phoneNum>
<phoneType>Work</phoneType>
<phoneNum>234567890</phoneNum>

如何获得2行:

EmpName, phoneType, phoneNum

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

如果您可以控制XML结构,我建议在公共父节点中包含每个电话信息的数据,例如:

<phone>
   <phoneType>Home</phoneType>
   <phoneNum>123456789</phoneNum>
</phone>
<phone>
   <phoneType>Work</phoneType>
   <phoneNum>234567890</phoneNum>
</phone>

然后你可以这样查询数据:

select
    s.EmpName
    ,m.c.value('(phoneType)[1]', 'nvarchar(max)') as PhoneType
    ,m.c.value('(phoneNum)[1]', 'nvarchar(max)') as PhoneNum
from MyTable as s
    outer apply s.PHONEXML.nodes('/phone') as m(c)

<强> SQL Fiddle demo

没有共同的父节点,任务似乎更复杂。我们需要选择一种类型的电话信息,然后使用兄弟关系获取其他信息,例如:

select
    s.EmpName
    ,m.c.value('(text())[1]', 'nvarchar(max)') as PhoneType
    ,m.c.value('(following-sibling::phoneNum)[1]', 'nvarchar(max)') as PhoneNum
from MyTable as s
    outer apply s.PHONEXML.nodes('/phoneType') as m(c)

但结果是SQL Server doesn't support following-siblingpreceding-sibling轴。