我在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>列表中,并从这些节点中提取名称。

10-07 17:25