获取T-SQL中包含特定内部节点的所有XML节点

时间:2015-04-24 22:47:19

标签: sql-server xml tsql xpath

我收到许多表的XML字符串信息。问题是,而不是格式

<root>
  <Candy>
    <Name>M-M</Name>
    <Size>Small</Size>
  </Candy>
  <Candy>
    <Name>KitKat</Name>
    <Size>Medium</Size>
  </Candy>
  <Fruit>
    <Description>Banana</Description>
    <Color>Yellow</Color>
  </Fruit>
  <Fruit>
    <Description>Cherry</Description>
    <Color>Red</Color>
  </Fruit>
<root>

我得到的是

<root>
  <Candy>
    <M-M>
      <Size>Small</Size>
    </M-M>
    <KitKat>
      <Size>Medium</Size>
    <KitKat>
  </Candy>
  <Fruit>
    <Banana>
      <Color>Yellow</Color>
    </Banana>
    <Cherry>
      <Color>Red</Color>
    </Cherry>
  </Fruit>
</root>

我需要在表格Candy中插入糖果行,在表格Fruit中插入水果行。如果我收到第一种格式,我就会

 select *
   from
openxml (@hDoc, '/root/Candy', 2)

我会得到所有的Candy行,但来自Web服务另一端的人不愿意这样发送。所以,在我打架之前,有没有办法让所有Candy使用第二种xml格式?比如请求所有具有名为Size的内部节点的节点?我正在使用SQLServer 2008,所以我可以使用openxml指令或更新的节点函数,我还没有学会如何使用它。此外,我认为处理速度比记忆更重要......

1 个答案:

答案 0 :(得分:3)

您可以尝试这种方式:

declare @T xml = '<root>
  <Candy>
    <M-M>
      <Size>Small</Size>
    </M-M>
    <KitKat>
      <Size>Medium</Size>
    </KitKat>
  </Candy>
  <Fruit>
    <Banana>
      <Color>Yellow</Color>
    </Banana>
    <Cherry>
      <Color>Red</Color>
    </Cherry>
  </Fruit>
</root>'

select candies.X.value('local-name(.)', 'varchar(100)') as Name
       , candies.X.value('Size[1]', 'varchar(100)') as Size
from @T.nodes('root/Candy/*[Size]') as candies(X)

<强> SQL Fiddle

xpath root/Candy/*[Size]表示获取<Candy>的所有子节点,无论其名称如何,都有<Size>个孩子。