我收到许多表的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指令或更新的节点函数,我还没有学会如何使用它。此外,我认为处理速度比记忆更重要......
答案 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>
个孩子。