我在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值中的电子邮件地址更新为特定值。 我怎样才能实现同样的目标?
答案 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并将其插回。