我有一個具有多個「父」節點的XML值列。我需要在每個父節點中插入一個「子」節點。如果我使用TSQL中的XML列的多節點插入
UPDATE mytable SET mycolumn.modify('insert <child/> into (//parent)[1]')
,那麼我只將一個子節點插入到第一個父節點中。
如何在單個查詢的每個父項中插入一個子項?
我有一個具有多個「父」節點的XML值列。我需要在每個父節點中插入一個「子」節點。如果我使用TSQL中的XML列的多節點插入
UPDATE mytable SET mycolumn.modify('insert <child/> into (//parent)[1]')
,那麼我只將一個子節點插入到第一個父節點中。
如何在單個查詢的每個父項中插入一個子項?
我相信最簡單的方法是使用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>
我結束移動一個級別(即採取所有父節點),計算替代XML,並使用「取代的值」而不是「插入」
@ulu - 我會在今天晚些時候發佈一個跨應用的例子,但看看這篇文章 - http://social.msdn.microsoft.com/Forums/en-US/sqlxml/ thread/4d0cd921-eab9-4b3e-b210-52b6ee65f6c1/ – 2012-03-23 12:42:15
感謝您的回答,但我需要更復雜的東西,我需要在類似的子節點後添加一個子節點,因此替換將無法工作。雖然看看你的交叉應用例子會很好。 – ulu 2012-03-24 12:15:33
@ulu - 對於遲到的回覆感到抱歉,發生了很多事情。我已經使用CROSS APPY和FOR XML更新了我的解決方案,以執行「插入」操作,並基本上用新節點重建XML。 – 2012-03-24 15:05:45