2012-03-30 187 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>