SQL Server中的XQuery与OpenXML

Gra*_*eme 2 xml sql-server xquery openxml

我在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>
Run Code Online (Sandbox Code Playgroud)

并想要这样的结果集:

MeetingID    Name
111          Smith
111          Jones
111          Brown
222          White
222          Bloggs
222          McDonald
Run Code Online (Sandbox Code Playgroud)

这很容易使用,select from openxml但是我无法使用XQuery。有人可以帮我在那儿,也许也可以对每种方法都有优缺点?

mar*_*c_s 5

修复无效的XML(<name>元素必须以</name>end标签结尾)后,您应该可以使用以下代码:

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)
Run Code Online (Sandbox Code Playgroud)

基本上,第一个调用.nodes()给您一个所有<meeting>节点的伪表,我从中提取会议ID。

该标签.nodes()上的第二次调用<meeting>将更深入地<participants>/<participant>研究子节点列表,并从这些节点中提取名称。