XML数据多个节点

时间:2016-03-29 00:03:38

标签: sql-server xml xml-parsing

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

XML Data Schema

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

这是指向的链接 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)

Updated SQL Query

1 个答案:

答案 0 :(得分:1)

对第一个结果执行第二次CROSS APPLY,以便获得与当前<horsedata>对应的<racedata>个元素。请参阅下面的工作演示示例。

示例数据:

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)

输出

enter image description here

更新

为了响应更新的查询,您应该按照上述查询中的建议在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)