我有一个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值”和“ y值”插入表B的XML根节点中?
尝试提出一条update语句来更新表B xml,使其具有从表A中添加的新属性及其值。
答案 0 :(得分:0)
我会避免基于字符串的方法...
但是-很遗憾-.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
您可以使用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;
我从没尝试过,但是.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;