2012-03-23 65 views
0

我有一個具有多個「父」節點的XML值列。我需要在每個父節點中插入一個「子」節點。如果我使用TSQL中的XML列的多節點插入

UPDATE mytable SET mycolumn.modify('insert <child/> into (//parent)[1]') 

,那麼我只將一個子節點插入到第一個父節點中。

如何在單個查詢的每個父項中插入一個子項?

回答

0

我相信最簡單的方法是使用CROSS APPLY和FOR XML來用SELECT語句重建XML。

下面是一個例子,希望它是有道理的。通過這種方法,您還可以加入到另一個表中,以便將數據插入<child2 />節點,從而使該解決方案非常靈活。

DECLARE @t TABLE (Document XML) 
INSERT INTO @t 
SELECT '<root><parent><child1>first row data</child1></parent><parent><child1>second row data</child1></parent></root>' 

SELECT 
    ref.value('child1[1]', 'varchar(max)') as child1, 
    'something to insert' as child2 
FROM @t CROSS APPLY Document.nodes('//parent') R(ref) 
FOR XML PATH('parent'), ROOT('root') 

結果

<root> 
    <parent> 
    <child1>first row data</child1> 
    <child2>something to insert</child2> 
    </parent> 
    <parent> 
    <child1>second row data</child1> 
    <child2>something to insert</child2> 
    </parent> 
</root> 
+0

@ulu - 我會在今天晚些時候發佈一個跨應用的例子,但看看這篇文章 - http://social.msdn.microsoft.com/Forums/en-US/sqlxml/ thread/4d0cd921-eab9-4b3e-b210-52b6ee65f6c1/ – 2012-03-23 12:42:15

+0

感謝您的回答,但我需要更復雜的東西,我需要在類似的子節點後添加一個子節點,因此替換將無法工作。雖然看看你的交叉應用例子會很好。 – ulu 2012-03-24 12:15:33

+0

@ulu - 對於遲到的回覆感到抱歉,發生了很多事情。我已經使用CROSS APPY和FOR XML更新了我的解決方案,以執行「插入」操作,並基本上用新節點重建XML。 – 2012-03-24 15:05:45

0

我結束移動一個級別(即採取所有父節點),計算替代XML,並使用「取代的值」而不是「插入」