T SQL добавление нескольких новых атрибутов в корневой узел XML - PullRequest
1 голос
/ 15 марта 2019

У меня есть таблица A, например:

 ID   X-value  Y-Value

 1      12       10
 2      11        4
 5       4        5

У меня есть другая таблица B, которая имеет:

ID   XML

1   somexml
2   somexml
3   somexml
4   somexml
5   somexml

Как вставить значения X и Yкак новые атрибуты 'x-value' и 'y-value' в корневой узел XML таблицы B?

Попытка создать оператор обновления для обновления xml таблицы B с добавлением новых атрибутов и их значенийиз таблицы А.

1 Ответ

0 голосов
/ 15 марта 2019

Я бы избегал строковых подходов ...

Но - к сожалению - .modify допускает только одно изменение за раз.
РЕДАКТИРОВАТЬ: см. Раздел ОБНОВЛЕНИЕ ниже!

Вы можете попробовать это:

Ваш макет таблицы

DECLARE @tblA TABLE(ID INT,X INT,Y INT);
INSERT INTO @tblA VALUES
 (1,12,10)
,(2,11, 4)
,(5, 4, 5);

DECLARE @tblB TABLE(ID INT,SomeXml XML);
INSERT INTO @tblB VALUES
 (1,'<root><SomeInnerNode test="1"/></root>')
,(2,'<root><SomeInnerNode test="2"/></root>')
,(3,'<root><SomeInnerNode test="3"/></root>')
,(4,'<root><SomeInnerNode test="4"/></root>')
,(5,'<root><SomeInnerNode test="5"/></root>');

- .modify() вставит атрибут со значениемстолбца набора результатов:

UPDATE t SET SomeXml.modify('insert attribute x {sql:column("X")} into (/root)[1]')
FROM (
    SELECT a.X,a.Y
          ,b.SomeXml
    FROm @tblA a
    INNER JOIN @tblB b ON a.ID=b.ID
) t;

- Проверьте результат

SELECT * FROM @tblB;

Просто повторите этот подход для каждого значения отдельно.

Другой подход с использованием XQuery

Вы можете сделать все это за один раз, воссоздав XML, используя XQuery

UPDATE t SET SomeXml=SomeXml.query('
                                        <root> {attribute x {sql:column("X")}}
                                               {attribute y {sql:column("Y")}}
                                        {
                                            /root/*
                                        }
                                        </root>
                                  ')
FROM (
    SELECT a.X,a.Y
          ,b.SomeXml
    FROm @tblA a
    INNER JOIN @tblB b ON a.ID=b.ID
) t;

SELECT * FROM @tblB;

ОБНОВЛЕНИЕ Отличный совет от OP (Thx!)

Я бы никогда не пробовал этого, но .modify() может добавить набор атрибутов за один раз с помощью следующего предложения:

UPDATE t SET SomeXml.modify('insert (
                                     attribute x {sql:column("X")}
                                    ,attribute y {sql:column("Y")}
                                    ) 
                             into (/root)[1]')
FROM (
    SELECT a.X,a.Y
          ,b.SomeXml
    FROm @tblA a
    INNER JOIN @tblB b ON a.ID=b.ID
) t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...