2014-07-22 5 views
1

J'ai une colonne XML
mise
Mise à jour colonne XML - Sql Server


<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> 

j'ai réellement besoin de mettre à jour ce qui précède dessus de la colonne pour insérer les ci-dessous sous Braches dans la branche Tag3, seulement si elles n'existent pas dans la colonne et également où Tag1 est vrai

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

J'ai ceci pour sélectionner où Tag1 est vrai mais un peu confus avec la mise à jour de la branche Tag3 avec les sous-branches Tag4 insérées seulement si elles n'existent pas dans Tag3.
SELECT * from table WHERE Setting.exist('//Tag1[text() = "true"]') = 1

Dans mon exemple ci-dessus, je veux que <Tag4>165</Tag4> doit être inséré dans la colonne et la sortie finale devrait être quelque chose comme ça. Toute aide est grandement appréciée!!

<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> 

Répondre

0

Le code ci-dessous insère les éléments qui n'existent pas, mais pas dans l'ordre. Peut-être que ça va aider.

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 !! Merci une tonne mate !!! –

Questions connexes