【问题标题】:XML Data multiple nodesXML 数据多节点
【发布时间】:2016-03-29 00:03:37
【问题描述】:

我有这个 xml 文件,所有其余的节点都依赖于第一个。我创建了一个树形图来帮助说明它。

我遇到的问题是每个节点都依赖于第一个节点,但它们没有任何相互链接的列。

这里是链接 XML Document

到目前为止,这是我的 sql

SELECT
        B.RD.query('racedata/todays_cls').value('.','varchar(max)') AS todays_cls,
        B.RD.query('racedata/horsedata/horse_name').value('.', 'varchar(max)') AS horse_name,
        B.RD.query('racedata/horsedata/jockey/jock_disp').value('.', 'varchar(max)') AS jockeyname
        FROM @xmlData.nodes('data') AS B(RD)

【问题讨论】:

    标签: sql-server xml xml-parsing


    【解决方案1】:

    在第一个结果的基础上执行第二个CROSS APPLY,这样您就可以得到与当前<racedata> 对应的<horsedata> 元素。请参阅下面的工作演示示例。

    样本数据:

    declare @xml XML = '
    <data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.trackmaster.com/xmlSchema/ppXMLData.xsd">  
      <racedata> 
        <race>1</race>
        <todays_cls>59</todays_cls>
        <distance>800.0</distance>
        <country>USA</country>  
        <horsedata> 
          <horse_name>BROADWAY KATE</horse_name>
          <owner_name>C. Steve Larue</owner_name>
          <program>1</program>
          <pp>1</pp>
          <weight>121</weight>
        </horsedata> 
        <horsedata> 
          <horse_name>UNFAITHFUL</horse_name>
          <owner_name>Melson, James L., Thomson, Ramona and Connell</owner_name>
          <program>2</program>
          <pp>2</pp>
          <weight>121</weight>
        </horsedata> 
      </racedata> 
      <racedata> 
          <race>2</race>
          <todays_cls>87</todays_cls>
          <distance>800.0</distance>
          <country>USA</country>  
          <horsedata> 
            <horse_name>MAGNETIC START</horse_name>
            <owner_name>Vernon D. Coyle</owner_name>
            <program>1</program>
            <pp>1</pp>
            <weight>121</weight>
          </horsedata>  
          <horsedata> 
            <horse_name>SKI POLE</horse_name>
            <owner_name>Downunder Cable, LLC</owner_name>
            <program>2</program>
            <pp>2</pp>
            <weight>121</weight>
          </horsedata> 
        </racedata>
    </data>
    '
    

    查询:

    SELECT 
        rd.value('race[1]', 'int') AS race,
        rd.value('todays_cls[1]','int') AS todays_cls,
        hd.value('pp[1]','int') AS pp,
        hd.value('weight[1]','int') AS weight
    FROM @xml.nodes('data/racedata') AS B(RD)
    CROSS APPLY RD.nodes('horsedata') AS C(HD)
    

    输出:


    更新

    为了响应更新后的查询,您应该按照上述查询中的建议在 horsedata 元素级别上进行分解,如下所示:

    SELECT
        B.RD.query('todays_cls').value('.','varchar(max)') AS todays_cls,
        C.HD.query('horse_name').value('.', 'varchar(max)') AS horse_name,
        C.HD.query('jockey/jock_disp').value('.', 'varchar(max)') AS jockeyname
    FROM @xml.nodes('data/racedata') AS B(RD)
        CROSS APPLY RD.nodes('horsedata') AS C(HD)
    

    【讨论】:

    • 您的代码有效,但是当您从 Race 2 添加数据时,它不会显示为 Race 2。我编辑了我的问题以向您展示。
    • @DanNick 将第二场比赛添加到样本数据中,查询保持不变。仍然显示预期的输出..
    • 好的,我明白我做错了什么。将其添加到等式中: CROSS APPLY RD.nodes('horsedata/jockey') AS D(JD) 与选择语句 JD.value('jock_disp[1]','varchar(100)') AS jockey 即当数据显示错误信息时
    • @DanNick 请参阅更新部分
    • 非常感谢您的帮助和耐心等待。过去两天我一直在努力使这个脚本正确。
    猜你喜欢
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 2016-05-13
    • 2018-07-25
    • 1970-01-01
    • 2018-02-01
    • 2018-01-01
    • 1970-01-01
    相关资源
    最近更新 更多