【问题标题】:XQuery vs OpenXML in SQL ServerSQL Server 中的 XQuery 与 OpenXML
【发布时间】:2010-08-04 13:13:05
【问题描述】:

我在 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 失败了。有人可以在那里帮助我,也许也可以为这两种方法提供优缺点吗?

【问题讨论】:

    标签: sql-server xml xquery openxml


    【解决方案1】:

    一旦您修复了无效的 XML(&lt;name&gt; 元素需要以 &lt;/name&gt; 结束标记结束),您应该可以使用它:

    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() 会给你一个包含所有 &lt;meeting&gt; 节点的伪表,我从中提取会议 ID。

    第二个.nodes() 调用&lt;meeting&gt; 标记更深入地挖掘&lt;participants&gt;/&lt;participant&gt; 子节点列表并从这些节点中提取名称。

    【讨论】:

    • 谢谢,正是我需要的。不过,我确实发现 openXML 语法更容易理解。
    • @Graeme:真的吗?实际上,我发现 OpenXML 非常不直观且非常混乱。
    【解决方案2】:

    这可能会为您提供基于 XQuery 的基于表的输出。

    (: Assume $x is your Xml Content. so :)
    let $x := Assign your Xml Content.
    let $d1:= <table border="1"><tr><td>Meeting</td><td> Participant</td></tr>
      { for $p in $x//meeting/participants/participant 
                  return element{'tr'} {
                        element{'td'} {$p/parent::*/parent::*/id/text()},
                        element{'td'} {data($p)}                        
                    }
              }
    
       </table>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多