将XML节点添加到表

时间:2017-03-30 15:58:22

标签: xml sql-server-2012

我有一个包含列ID和列XMLData的表格。不幸的是,XML数据列当前没有对XML本身内部的ID的任何引用,所以如果我只导出该列并解析它,我将无法将其绑定回ID。

我正在尝试向XML添加类似于以下内容的节点:

<AddedNode>
    <Id>10862832</Id>
</AddedNode>

允许从XML本身解析ID,并将其连接回来。我尝试通过以下方法添加数据:

With Test_CTE (Id, XMLData, AddedXML)
As
(
select Id, XMLData, cast('<AddedNode>
            <Id>' + cast(Id as varchar(20)) + '</Id>
        </AddedNode>' as varchar(max)) as AddedXML
from dbo.TestTable
)


update T
set XMLData.modify('insert ' + CTE.AddedXML + '
        as last into (/RootNode[1])
') 
from dbo.TestTable T
inner join Test_CTE CTE on CTE.Id = T.Id

但是我收到错误“XML数据类型方法的参数1”修改“必须是字符串文字”。

我确定这与我试图通过一列数据拉出插入节点有关,但有人能告诉我如何修复它吗?

注意:我意识到我也可以通过使用变量在整个表上使用while循环来完成此操作,但表中有大约250万行,并且需要的时间比我想要的长。

1 个答案:

答案 0 :(得分:1)

如果我能正确理解,可以更容易地做到这一点:

DECLARE @testtable TABLE(ID INT IDENTITY, XMLData XML);
INSERT INTO @testtable VALUES('<root><a>test</a></root>')
                            ,('<root><a>test</a><b>Some other</b></root>');

UPDATE @testtable SET XMLData.modify(N'insert <AddedNode><Id>{sql:column("ID")}</Id></AddedNode> as first into (/root)[1]');

SELECT * FROM @testtable;

结果

ID  XMLData
1   <root>
      <AddedNode>
        <Id>1</Id>
      </AddedNode>
      <a>test</a>
    </root>

2   <root>
      <AddedNode>
        <Id>2</Id>
      </AddedNode>
      <a>test</a>
      <b>Some other</b>
    </root>

更新

您自己的方法可能会更正(从不通过字符串连接构建XML!):

WITH Test_CTE AS
(
    SELECT XMLData
         ,(SELECT ID AS [Id] FOR XML PATH('AddedNode'),TYPE)  as AddedXML
    FROM dbo.TestTable
)
UPDATE Test_CTE SET XMLData.modify(N'insert sql:column("AddedXML") as first into (/root)[1]');

SELECT * FROM dbo.TestTable;