我有一个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