2012-03-30 140 views
1

请帮忙!是否有可能用其他元素替换sql数据库的xml字段中的元素。我曾尝试使用.modify(替换值),但我只能替换元素内的文本而不是节点。SQL XML替换元素

最终,我试图用XML字段中的另一个元素(可能具有相同名称)更新可能包含或不包含其他元素的元素。 (我使用SQL Server 2008)

E.g:

<Root> 
    <SubVERSION2> 
    <Value1> 
    </Value1> 
    <Value2> 
    </Value2> 
    <Value3> 
    </Value3> 
    </SubVERSION2> 
</Root> 

任何帮助将是非常赞赏:

<Root> 
    <Sub> 
    <Value1> 
    </Value1> 
    <Value2> 
    </Value2> 
    <Value3> 
    </Value3> 
    </Sub> 
</Root> 

会被替代!

回答

0

您可以重新创建XML:

declare @x xml = '<Root> 
    <Sub> 
    <Value1>1 
    </Value1> 
    <Value2>2 
    </Value2> 
    <Value3>3 
    </Value3> 
    </Sub> 
</Root>' 

select cast(('<Root>' + 
    cast(
    (
     select t.c.query('.') 
     from @x.nodes('Root/Sub/*') t(c) 
     for xml path(''), root('SubVERSION2') 
    ) as nvarchar(max)) + '</Root>') as xml) 

产生所需的输出:

<Root> 
    <SubVERSION2> 
    <Value1>1 
    </Value1> 
    <Value2>2 
    </Value2> 
    <Value3>3 
    </Value3> 
    </SubVERSION2> 
</Root> 
0
declare @T table(XMLCol xml) 

insert into @T values (' 
<Root> 
    <Sub> 
    <Value1></Value1> 
    <Value2></Value2> 
    <Value3></Value3> 
    </Sub> 
</Root>') 

update @T set 
    XMLCol = XMLCol.query('for $s in Root/Sub 
         return 
          <Root> 
          <SubVERSION2> 
           { $s/* } 
          </SubVERSION2> 
          </Root>') 

结果:

<Root> 
    <SubVERSION2> 
    <Value1 /> 
    <Value2 /> 
    <Value3 /> 
    </SubVERSION2> 
</Root>