0

我对 sql 的 xml 很陌生,对如何解决这个问题非常困惑。

我有以下 XML,它对应于我的表 tbAgreement 中名为 @XmlContent 的列(由 @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>

重要的是要删除旧标签 vendor 和 city 并分别更新所有表记录。做这个的最好方式是什么?提前致谢!

4

1 回答 1

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
于 2013-07-10T09:40:58.820 回答