我正在尝试使用
在SQL Server表中更新XML列XML.modify replace value of (XML DML)
在以下XML示例中,有没有一种方法可以将所有vendorId
用值1
替换为另一个值?从http://technet.microsoft.com/en-us/library/ms190675.aspx中的文档中,我似乎需要为此指定记录索引。但是就我而言,XML内将有多个记录,我不知道它会加入的顺序。
<LineItems>
<LineItem productId="48" invId="1573" quantity="1" id="1" vendorId="1022" price="1350.0000" cost="450.0000" discount="0" acqu="2" />
<LineItem productId="1" invId="0" quantity="1" id="2" vendorId="1" price="400" cost="0" discount="0" />
<LineItem productId="46" invId="1574" quantity="1" id="3" vendorId="1022" price="789.0000" cost="263.0000" discount="0" acqu="4" />
<LineItem productId="1" invId="0" quantity="1" id="4" vendorId="1" price="300" cost="0" discount="0" />
</LineItems>
请建议。
谢谢!
您必须使用循环并一次更新一个值。
while @XML.exist('/LineItems/LineItem[@vendorId = "1"]') = 1
set @XML.modify('replace value of (/LineItems/LineItem[@vendorId = "1"]/@vendorId)[1] with "2"' )
sql小提琴
更新表中XML列的版本看起来像这样。
while exists(
select * from T
where T.XMLColumn.exist('/LineItems/LineItem[@vendorId = "1"]') = 1
--and [some other condition]
)
begin
update T
set XMLColumn.modify('replace value of (/LineItems/LineItem[@vendorId = "1"]/@vendorId)[1] with "2"')
where T.XMLColumn.exist('/LineItems/LineItem[@vendorId = "1"]') = 1
--and [some other condition]
end
SQL小提琴
如果您需要将常数字符串替换为另一个字符串,我建议您使用REPLACE
功能并在字符串上进行完整。
DECLARE @XML XML /*your xml value*/
SELECT REPLACE(CONVERT(NVARCHAR(MAX),@XML),'vendor="1"','"vendor="2"')
在许多情况下,它要容易得多,然后以XML风格进行。