【问题标题】:Adding XML Node to all Rows in a Table将 XML 节点添加到表中的所有行
【发布时间】:2017-03-30 15:58:21
【问题描述】:

我有一个表,其中有一列 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 万行,这需要的时间比我想要的要长。

【问题讨论】:

    标签: xml sql-server-2012


    【解决方案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;
    

    【讨论】:

    • 那太容易了。感谢您及时的回复。我会在它打开后立即接受。
    • @rdbradshaw 只是为了告诉你,你哪里出错了,我更新了如何纠正你自己的尝试。
    猜你喜欢
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多