我在SQL Server表中有此XML:
<root>
<meetings>
<meeting>
<id>111</id>
<participants>
<participant><name>Smith</name></participant>
<participant><name>Jones</name></participant>
<participant><name>Brown</name></participant>
</participants>
</meeting>
<meeting>
<id>222</id>
<participants>
<participant><name>White</name></participant>
<participant><name>Bloggs</name></participant>
<participant><name>McDonald</name></participant>
</participants>
</meeting>
</meetings>
</root>
想要这样的结果集:
MeetingID Name
111 Smith
111 Jones
111 Brown
222 White
222 Bloggs
222 McDonald
使用
select from openxml
很容易,但使用xquery失败。有人能帮我一下吗,也许能给我两种方法的利弊? 最佳答案
一旦修复了无效的xml(需要用<name>
结束标记结束</name>
元素),您就应该能够使用:
SELECT
Meetings.List.value('(id)[1]', 'int') AS 'Meeting ID',
Meeting.Participant.value('(name)[1]', 'varchar(50)') AS 'Name'
FROM
@input.nodes('/root/meetings/meeting') AS Meetings(List)
CROSS APPLY
Meetings.List.nodes('participants/participant') AS Meeting(Participant)
基本上,对
.nodes()
的第一次调用给您一个包含所有<meeting>
节点的伪表,我从中提取会议id。第二个
.nodes()
调用<meeting>
标记会深入到子节点的<participants>/<participant>
列表中,并从这些节点中提取名称。