sql-server – 如何将元素插入到xml列中,不知道树是否已经存在?

前端之家收集整理的这篇文章主要介绍了sql-server – 如何将元素插入到xml列中,不知道树是否已经存在?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个sql Server 2008中的值表,我希望将值插入到另一个表的匹配行中的 XML列中. xml列可能包含或可能没有导致到我要插入的元素的所有标签.

我可以通过多个更新/ xml.modify语句来实现这一点,以确保在插入元素之前存在这些标签,但是这似乎真的没有效率,如果我要插入一个元素5或10个标签,该怎么办?

这是一个创建的example in SQL fiddle

设置是我有2个表(简化/组成这里,使一个可以理解的场景)

CREATE TABLE tableColors (id nvarchar(100),color  nvarchar(100))
CREATE TABLE xmlTable (id nvarchar(100),xmlCol xml)`

我需要插入元素< root>< colors>< color> tableColors.color< / color>< / colors>< / root>进入xmlTable,其中id匹配,元素不存在. xmlCol可以包含更多的元素,甚至是空白的.颜色标签为0或许多,颜色标签为0或1.

将元素插入正确位置的最终语句是有意义的,但是如果父标签不存在,则不会起作用.

UPDATE xmlTable
SET xmlCol.modify(' insert <color>{sql:column("color")}</color> as first into (/root/colors)[1] ')
FROM xmlTable
INNER JOIN tableColors ON xmlTable.id = tableColors.id
WHERE xmlCol.exist('/root/colors/color[(text()[1]) = sql:column("color")]') = 0

所以,我需要在运行此更新语句之前确保/ root / colors存在.请告诉我我缺少一些东西,我不必明确地插入一个root(如果是空的),然后将颜色插入到根目录中.

为了进一步解释,这里是将新元素插入/ root / colors之前和之后:

New Element              XML before                                           XML after
<color>blue</color>       -blank-                                              <root><colors><color>blue</color></colors></root>
<color>green</color>      <root><vegitation>yes</vegitation></root>            <root><vegitation>yes</vegitation><colors><color>green</color></colors></root>
<color>white</color>      <root><colors><color>brown</color></colors></root>   <root><colors><color>brown</color><color>white</color></colors></root>

再次,这是一个完整的example in SQL fiddle,在那里我实现了我想要的,但必须有一个更好的方法.我失踪了什么

解决方法

您可以将嵌套结构包含在插入语句中,只需一个这样的更新:
UPDATE #xmlTable
SET xmlCol.modify('
insert if (count(/root)=0) then <root><colors><color>{sql:column("color")}</color></colors></root> 
else (if (count(/root/colors)=0) then <colors><color>{sql:column("color")}</color></colors> 
else <color>{sql:column("color")}</color>) as first into 
(if (count(/root)=0) then (/) else (if (count(/root/colors)=0) then (/root) else (/root/colors)))[1]')
FROM #xmlTable
INNER JOIN #tableColors
    ON #xmlTable.id = #tableColors.id
WHERE xmlCol.exist('/root/colors/color[(text()[1])=sql:column("color")]') = 0
原文链接:https://www.f2er.com/mssql/75575.html

猜你在找的MsSQL相关文章