我们如何更新xml列中的某些节点?

时间:2019-07-17 21:26:53

标签: sql-server tsql

我在表格的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

1 个答案:

答案 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")');