Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用SQL替换XML中的值_Sql Server_Xml_Tsql_Xpath_Xquery - Fatal编程技术网

Sql server 使用SQL替换XML中的值

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

我需要用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@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来执行此操作?更新了一个示例