这将替换每行的一次 URL。从您的示例 XML 来看,每行只有一个 URL。
with C1 as
(
select xmlData,
xmlData.value('(/MA/A/URL/text())[1]', 'nvarchar(500)') as URL
from Pages
),
C2 as
(
select xmlData,
URL,
left(URL, len(URL) - 1) as URL2
from C1
where right(URL, 1) = '-'
)
update C2
set xmlData.modify('replace value of (/MA/A/URL/text())[1]
with sql:column("C2.URL2")')
提取 CTE C1 中的 URL 值。
从 URL 中删除最后一个“-”并将其放在 CTE C2 的 URL2 中。同时删除不需要更新的行。
使用modify() 方法更新 XML(xml 数据类型)
这是另一个在查询的 XML 部分中完成工作的版本。
update Pages
set xmlData.modify('replace value of (/MA/A/URL/text())[1]
with fn:substring((/MA/A/URL/text())[1], 1, fn:string-length((/MA/A/URL/text())[1])-1)')
where xmlData.exist('/MA/A/URL[fn:substring(text()[1], fn:string-length(text()[1]), 1) = "-"]') = 1
一次只能更新一个节点,因此如果一行中有多个 URL,则必须将上面的代码循环并执行更新,只要有要更新的内容即可。您可以使用@@ROWCOUNT
来检查更新是否更新了任何内容并重做更新,直到@@ROWCOUNT = 0
.