T SQL向XML的根节点添加了多个新属性

时间:2019-03-15 14:44:03

标签: sql sql-server xml tsql

我有一个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中添加的新属性及其值。

1 个答案:

答案 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

通过重新创建 XML一次完成全部操作
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;

UPDATE 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;