2014-07-22 55 views
1

我有一個XML列
設置
更新XML列 - SQL服務器


<root> 
    <Tag1>true</Tag1> 
    <Tag2> 
    <Tag3> 
     <Tag4>43</Tag4> 
     <Tag4>44</Tag4> 
     <Tag4>46</Tag4> 
     <Tag4>50</Tag4> 
     <Tag4>89</Tag4> 
     <Tag4>99</Tag4> 
     <Tag4>166</Tag4> 
    </Tag3> 
    </Tag2> 
</root> 

我真的需要更新上述上面的表格中插入下面的子設有分公司爲TAG3分支,只如果它們不存在於列中並且Tag1爲真

<Tag4>43</Tag4> 
<Tag4>44</Tag4> 
<Tag4>46</Tag4> 
<Tag4>165</Tag4> 

我有這個選擇Tag1爲true的地方,但是與僅在Tag3中不存在時才插入Tag4子分支的Tag3分支有點混淆。
SELECT * from table WHERE Setting.exist('//Tag1[text() = "true"]') = 1

在我上面的例子中,我只希望<Tag4>165</Tag4>應該插入的列,並最終輸出應該是這樣的。任何幫助是極大的讚賞!!

<root> 
    <Tag1>true</Tag1> 
    <Tag2> 
    <Tag3> 
     <Tag4>43</Tag4> 
     <Tag4>44</Tag4> 
     <Tag4>46</Tag4> 
     <Tag4>50</Tag4> 
     <Tag4>89</Tag4> 
     <Tag4>99</Tag4> 
     <Tag4>165</Tag4> 
     <Tag4>166</Tag4> 
    </Tag3> 
    </Tag2> 
</root> 

回答

0

下面插入不存在的元素,但不是按順序。也許它會有所幫助。

DECLARE @x1 XML = 
'<root> 
    <Tag1>true</Tag1> 
    <Tag2> 
    <Tag3> 
     <Tag4>43</Tag4> 
     <Tag4>44</Tag4> 
     <Tag4>46</Tag4> 
     <Tag4>50</Tag4> 
     <Tag4>89</Tag4> 
     <Tag4>99</Tag4> 
     <Tag4>166</Tag4> 
    </Tag3> 
    </Tag2> 
</root>' 
, @x2 XML = 
'<Tag4>43</Tag4> 
<Tag4>44</Tag4> 
<Tag4>46</Tag4> 
<Tag4>165</Tag4>'; 

DECLARE @x3 XML = (
    SELECT * 
    FROM (
     SELECT s.n.value('.','int') FROM @x2.nodes('*') AS s(n) 
     EXCEPT 
     SELECT f.n.value('.','int') 
     FROM @x1.nodes('/root/Tag2/Tag3/Tag4') AS f(n) 
    ) AS Tag4Values (Tag4) 
    FOR XML PATH ('')); 

SET @x1.modify('insert sql:variable("@x3") into (/root/Tag2/Tag3)[1]'); 

SELECT @x1; 
+0

LifeSaver !!謝謝你的伴侶! –