Sql server 使用SQL替换XML中的值
我需要用SQL替换xml中的一个值,这里我面临的挑战是,我要替换的值不在特定的xpath上,相同的值在不同的节点上,xpath也不同,所以基本上我想要找到并替换一个值 例如:Sql server 使用SQL替换XML中的值,sql-server,xml,tsql,xpath,xquery,Sql Server,Xml,Tsql,Xpath,Xquery,我需要用SQL替换xml中的一个值,这里我面临的挑战是,我要替换的值不在特定的xpath上,相同的值在不同的节点上,xpath也不同,所以基本上我想要找到并替换一个值 例如: 2018-04-05 2018-04-05 1. 2018-04-05 2. 2018-04-05 3. 2018-04-05 在上述示例中,我需要将日期2018-04-05替换为2018-04-06 请在此提供帮助。如果必须替换不同路径中的元素,可以将xml转换为*char并使用replace: declare@xm
2018-04-05
2018-04-05
1.
2018-04-05
2.
2018-04-05
3.
2018-04-05
在上述示例中,我需要将日期2018-04-05替换为2018-04-06
请在此提供帮助。如果必须替换不同路径中的元素,可以将
xml
转换为*char
并使用replace
:
declare@xml='2018-04-05 2018-04-05 1 2018-04-05 2 2018-04-05 3 2018-04-05'
选择cast(替换(cast(@xml作为nvarchar(max)),'2018-04-05','2018-04-06')作为xml)
结果:
函数.modify()
不允许您每次调用更改多个值。您可以使用REPLACE()
在字符串级别执行此操作,但这可能会产生副作用
您可以做的(但这不会很快)是在循环中使用.modify()
,直到所有发生的事件都被替换,如下所示:
DECLARE @xml XML=
N'<data>
<policy>
<Effectivedate>2018-04-05</Effectivedate>
<TermStartDate>2018-04-05</TermStartDate>
<Line>
<Risk>
<Coverage>
<Type>1</Type>
<coverstartdate>2018-04-05</coverstartdate>
</Coverage>
<Coverage>
<Type>2</Type>
<coverstartdate>2018-04-05</coverstartdate>
</Coverage>
<Coverage>
<Type>3</Type>
<coverstartdate>2018-04-05</coverstartdate>
</Coverage>
</Risk>
</Line>
</policy>
</data>';
WHILE @xml.exist(N'//*[text()="2018-04-05"]')=1
BEGIN
SET @xml.modify(N'replace value of (//*[text()="2018-04-05"]/text())[1] with "2018-04-06"');
END
SELECT @xml;
DECLARE@xml=
不
2018-04-05
2018-04-05
1.
2018-04-05
2.
2018-04-05
3.
2018-04-05
';
而@xml.exist(N'/*[text()=“2018-04-05”]')=1
开始
SET@xml.modify(N'用“2018-04-06”替换(//*[text()=“2018-04-05”]/text())[1]的值);
终止
选择@xml;
这是丑陋的(由于循环)和缓慢的,但至少是
XQuery
什么数据库引擎?请为您正在使用的RDBMS添加一个标记,因为它们之间的字符串操作差异很大。另外,您是否可以编辑上面的内容以显示一些XML示例以及值必须如何更改?如果XML没有属性且没有不规则的空格,那么这可能很容易。否则可能会有挑战性。请共享您的数据实例、您尝试的代码。为什么需要使用SQL来执行此操作?更新了一个示例