移动属性并删除XML列中的标记

时间:2013-03-05 04:04:30

标签: sql sql-server xml xpath-2.0

我是xml for sql的新手,对于如何解决这个问题非常困惑。

我有以下XML,它对应于我的表tbAgreement中的一个名为@XmlContent的colunm(由@ ID,@ Code,@ Name和@XmlContent组成):

<agreement>
   <vendor code='VND_johnmcfly>
   <city code='CTY_Vegas'>
   <events>
     <event date='2012-21-08'/>
     <event date='2013-20-01'/>
     <event date='2014-20-01'/>
   </events>
</agreement>

我想要做的是从供应商和城市标签移动代码值并将其作为事件属性放置:

<agreement>
   <events>
     <event date='2012-21-08' vendor='VND_johnmcfly' city='CTY_Vegas'/>
     <event date='2013-20-01' vendor='VND_johnmcfly' city='CTY_Vegas'/>
     <event date='2014-20-01' vendor='VND_johnmcfly' city='CTY_Vegas'/>
   </events>
</agreement>

重要的是要删除旧标签供应商和城市,并分别更新所有表记录。做这个的最好方式是什么?提前谢谢!

1 个答案:

答案 0 :(得分:0)

也许你已经找到了答案,但对其他人来说可能会有所帮助

declare @xml xml
set @xml=
'<agreement>
   <vendor code="VND_johnmcfly" />
   <city code="CTY_Vegas" />
   <events>
     <event date="2012-21-08"/>
     <event date="2013-20-01"/>
     <event date="2014-20-01"/>
   </events>
</agreement>'

declare @txml table(x xml)
insert into @txml values(@xml);

UPDATE t SET x=x.query('<agreement>
<events>
{
for $d in //events/event/@date,
    $v in //vendor/@code,
    $c in //city/@code
return <event date="{$d}" city="{$c}" vendor="{$v}"/>
}
</events>
</agreement>')
FROM @txml t 

select * from @txml