我在表格的xml列中包含以下内容。如何编写只替换部分值的查询?文字REPLACE将替换为另一个值。
<Root>
<Response xmlns:ns1="urn:names:tc:legalxml-message1:schema:xsd:Message-4.0">
<Message xmlns:ns2="urn:names:tc:legalxml-message2:schema:xsd:Types-4.0">
<Response1>
<ns1:Name>REPLACE name1</Name>
</Response1>
<Response2>
<ns1:Name>REPLACE name2</Name>
</Response2>
<Response3>
<ns1:Name>REPLACE name3</Name>
</Response3>
<Response4>
<ns1:Name>REPLACE name4</Name>
</Response4>
</Message>
</Response>
</Root>
我尝试了以下查询,并收到一条错误消息。
XQuery [r.x.modify()]:“替换值”的目标必须是非元数据属性或具有简单键入内容的元素,找到了“ element(Name,xdt:untyped)吗?”
我正在关注这个link。
declare @SearchString varchar(100),@ReplaceString varchar(100)
SELECT @SearchString = 'REPLACE',@ReplaceString = 'NEWVALUE'
UPDATE r
SET x.modify('replace value of (/Root/Response/Message/Response1/Name)[1] with sql:column("y")')
FROM (SELECT xmlColumn,REPLACE(t.u.value('Name[1]','varchar(100)'),@SearchString,@ReplaceString) as y
FROM tblMessage
CROSS APPLY tblMessage.nodes('/Root/Response/Message/Response1/Name')t(u)
)r
答案 0 :(得分:1)
给出以下示例数据:
DECLARE @xml XML =
'<Root>
<Response xmlns:ns1="urn:names:tc:legalxml-message1:schema:xsd:Message-4.0">
<Message xmlns:ns2="urn:names:tc:legalxml-message2:schema:xsd:Types-4.0">
<Response1>
<ns1:Name>REPLACE name1</ns1:Name>
</Response1>
<Response2>
<ns1:Name>REPLACE name2</ns1:Name>
</Response2>
<Response3>
<ns1:Name>REPLACE name3</ns1:Name>
</Response3>
<Response4>
<ns1:Name>REPLACE name4</ns1:Name>
</Response4>
</Message>
</Response>
</Root>';
DECLARE @replaceText VARCHAR(100) = 'Something New Here';
您可以使用XML modify method更新值。要通过节点名称明确地执行此操作,可以执行以下操作:
SET @xml.modify('replace value of (/Root/Response/Message/Response4/*:Name/text())[1]
with sql:variable("@replaceText")');
在此^^示例中,我正在更新Response4节点。您还可以使用节点位置来更新XML。下面的示例将更新Response1:
SET @xml.modify('replace value of (/Root/Response/Message//*:Name/text())[1]
with sql:variable("@replaceText")');
要更新Response2,您需要将[1]
更改为[2]
,如下所示:
SET @xml.modify('replace value of (/Root/Response/Message//*:Name/text())[2]
with sql:variable("@replaceText")');