如何在sql server的所有节点中添加XML节点

时间:2015-08-11 07:54:42

标签: sql-server xml sql-server-2008

我在sql数据库中有一个XML类型的列。我想在名称为EFDRow的所有节点中添加具有相同值的新节点GoodsSerial

<Serials>
  <GoodsSerial>
    <GSerialSCredit>2015/08/11</GSerialSCredit>
    <GSerialECredit>2015/08/11</GSerialECredit>
    <GSerialStart>1</GSerialStart>
    <GSerialEnd>5</GSerialEnd>
  </GoodsSerial>
  <GoodsSerial>
    <GSerialSCredit>2015/08/11</GSerialSCredit>
    <GSerialECredit>2015/08/11</GSerialECredit>
    <GSerialStart>10</GSerialStart>
    <GSerialEnd>15</GSerialEnd>
  </GoodsSerial>
</Serials>

我试过这段代码

UPDATE Tbl
SET SerialXml.modify('insert <EFDRow>{sql:column("EFDRow")}</EFDRow> into (/Serials/GoodsSerial)[1]')

但它只将EFDRow节点添加到第一个GoodsSerial节点。

2 个答案:

答案 0 :(得分:2)

您可以粉碎XML /Serials/GoodsSerial,并使用EFDRow添加for xml path的值重建它。

update dbo.Tbl
set SerialXml = (
                select GS.X.query('*'),
                       EFDRow
                from SerialXml.nodes('/Serials/GoodsSerial') as GS(X)
                for xml path('GoodsSerial'), root('Serials'), type
                );

GS.X.query('*')将为您提供GoodsSerial中已存在的所有节点。

SQL Fiddle

答案 1 :(得分:0)

修改一次只能替换1个值。 您必须遍历所有节点:

Updating all nodes by condition with xml to sql

xml-sql: update multiple nodes