Я бы избегал строковых подходов ...
Но - к сожалению - .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;