让我们说我有一个包含以下列的表:
EmpID, EmpName, PHONEXML
使用PHONEXML赞:
<phoneType>Home</phoneType>
<phoneNum>123456789</phoneNum>
<phoneType>Work</phoneType>
<phoneNum>234567890</phoneNum>
如何获得2行:
EmpName, phoneType, phoneNum
非常感谢任何帮助。
答案 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-sibling
或preceding-sibling
轴。