我有一个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>
我实际上需要更新上面的列以将下面的子分支插入到Tag3分支中,只有当它们不存在于列中且Tag1为真时才
<Tag4>43</Tag4>
<Tag4>44</Tag4>
<Tag4>46</Tag4>
<Tag4>165</Tag4>
我有这个选择Tag1为真的位置,但是只有在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 :(得分: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;