У меня есть таблица значений в SQL Server 2008, из которой я хочу вставить значение в столбец XML в соответствующей строке другой таблицы. Столбец xml может содержать или не иметь все теги, предшествующие элементу, который я хочу вставить.
Я могу добиться этого с помощью нескольких инструкций update/ xml.modify
, чтобы гарантировать, что теги существуют до вставки элемента, но это кажется действительно неэффективным, и что, если я хотел бы вставить тег 5 или 10 в глубину?
Здесь создан пример скрипта SQL
Настройка состоит в том, что у меня есть 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.
Для дальнейшего объяснения здесь до и после вставки нового элемента в /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>
И снова здесь полный пример в скрипте SQL, где я достигаю того, чего хочу, но должен быть лучший способ. Что мне не хватает?