更新sql中的XML列值

时间:2013-07-23 10:18:23

标签: xml sql-server-2008-r2

我在sql表中有一个需要更新的XML列。说结构如下:

<JPS>
 <P>
  <JP>
   <IsRequired>true</IsRequired>
   <Name>Folder</Name>
   <Value>C:\Test</Value>
  </JP>
  <JP>
   <IsRequired>false</IsRequired>
   <Name>Email Addresses</Name>
   <Value>a@a.com; b@b.com</Value>      
  </JP>
</P>

我想将表中所有行中的所有XML值中的电子邮件地址更新为特定值。 我怎样才能实现同样的目标?

2 个答案:

答案 0 :(得分:1)

如果您要更新<Value>标记<JP>元素的<Name>Email Addresses</Name>元素的内容,那么您可以使用以下内容:

;WITH XmlEmail AS
(
SELECT 
    SomeUniqueID,  // some unique/primary key ID from your table - adapt as needed!
    JPReq = XJP.value('(IsRequired)[1]', 'varchar(20)'),
    JPName = XJP.value('(Name)[1]', 'varchar(20)'),
    JPValue = XJP.value('(Value)[1]', 'varchar(20)')
FROM 
    dbo.YourTable
CROSS APPLY
    YourXmlColumn.nodes('/JPS/P/JP[Name="Email Addresses"]') AS XTbl(XJP)
)
UPDATE dbo.YourTable
SET YourXmlColumn.modify('replace value of (/JPS/P/JP[Name="Email Addresses"]/Value/text())[1] with "newmail@test.tst"')
FROM XmlEmail xe 
WHERE dbo.YourTable.SomeUniqueID = xe.SomeUniqueID

这会将所有行和所有 <JP>/<Value>个节点更新为相同的值 - 您正在寻找的是什么?

更新添加了对仅检查和更新XML列实际包含<JP>标记且其名称为Email Addresses的行的支持 - 它要求有您桌面上的主键(不确定它是什么,因为您没有说出任何内容)....我使用SomeUniqueID作为列名 - 根据需要适应您的桌子!

答案 1 :(得分:0)

你不能在标准的sql中做到这一点。

使用标准sql,您应该一次读取一个相关的xml行,更新xml并将其插回。