1

I have the following sample XML and I am looking to Update:

  1. ShipToAddress1 to: test777
  2. TestID to: 1234 where Sequence =1

<OBJECT CLASS="Test1" ID="-1" FULL="FULL" VERSION="1">
<FIELD NAME="OrderDate">20220619</FIELD>
<FIELD NAME="OrderParty">Individual</FIELD>
<FIELD NAME="ShipToID">34567</FIELD>
<FIELD NAME="ShipToAddress1">123 Test Street</FIELD>
<FIELD NAME="ShipToCity">TestCity</FIELD>
<FIELD NAME="ShipToState">IL</FIELD>
<FIELD NAME="ShipTocountry">USA</FIELD>
<FIELD NAME="TaxNumber">444</FIELD>
<FIELD NAME="DiscountCode">Summer22</FIELD>
<SUBTYPE NAME="SubType1">
    <OBJECT NAME="SubType111" ID="-1">
        <FIELD NAME="TestID">-1</FIELD>
        <FIELD NAME="Sequence">1</FIELD>
        <FIELD NAME="ParentSequence">-1</FIELD>
        <FIELD NAME="ExtID">-1</FIELD>
        <FIELD NAME="ExtName">ABC</FIELD>
    </OBJECT>
    <OBJECT NAME="SubType111" ID="-1">
        <FIELD NAME="TestID">-1</FIELD>
        <FIELD NAME="Sequence">2</FIELD>
        <FIELD NAME="ParentSequence">1</FIELD>
        <FIELD NAME="ExtID">-1</FIELD>
        <FIELD NAME="ExtName">DEF</FIELD>
        <FIELD NAME="__ExtendedData">&lt;OBJECT 
     CLASS="Meet123" ID="-1" FULL="FULL" 
     VERSION="1"&gt;&lt;FIELD 
     NAME="OrderDetailID"&gt;-1&lt;/FIELD&gt;&lt;FIELD 
     NAME="OrderID"&gt;-1&lt;/FIELD&gt;&lt;FIELD 
     NAME="Sequence"&gt;0&lt;/FIELD&gt;&lt;FIELD 
     NAME="AttendeeID"&gt;123&lt;/FIELD&gt;&lt;FIELD NAME="AttendeeID_Name"&gt;Test, Mark/I H 6&lt;/FIELD&gt;&lt;FIELD 
     NAME="ShowList"&gt;1&lt;/FIELD&gt;&lt;FIELD 
     NAME="BdgeName"&gt;Mark&lt;/FIELD&gt;&lt;FIELD 
     NAME="BadgeCompanyName"&gt;I H 6&lt;/FIELD&gt;
     &lt;/OBJECT&gt;</FIELD>
    </OBJECT>
    <OBJECT NAME="SubType111" ID="-1">
        <FIELD NAME="TestID">-1</FIELD>
        <FIELD NAME="Sequence">3</FIELD>
        <FIELD NAME="ParentSequence">1</FIELD>
        <FIELD NAME="ExtID">-1</FIELD>
        <FIELD NAME="ExtName">GHI</FIELD>
    </OBJECT>
</SUBTYPE>
<SUBTYPE NAME="SubType2"/>
<SUBTYPE NAME="SubType3"/>

');


I have tried the following SQL it says command executed successfully but the data does not get updated:

DECLARE @myDoc XML;  

set @myDoc = The above XML 

SET @myDoc.modify('replace value of (/Object/Field[@NAME=("ShipToAddress1")]/text())[1] with 
"test777"')
 Select @myDoc

Where is the query going wrong?

Thanks.

Yitzhak Khabinsky
  • 18,471
  • 2
  • 15
  • 21
vbgp
  • 73
  • 7
  • While asking a question, you need to provide a [minimal reproducible example](https://stackoverflow.com/help/minimal-reproducible-example): (1) DDL and sample data population in T-SQL. (2) What you need to do, i.e. logic and your code attempt implementation of it in T-SQL. (3) Desired output, based on the sample data in the #1 above. (4) Your SQL Server version (SELECT @@version;). – Yitzhak Khabinsky Oct 07 '22 at 15:21

1 Answers1

1

Please try the following solution.

Notable points:

  • XML is case sensitive.
  • It is better to use T-SQL variables instead of hard-coded values.

SQL

DECLARE @myDoc XML = 
N'<OBJECT CLASS="Test1" ID="-1" FULL="FULL" VERSION="1">
    <FIELD NAME="OrderDate">20220619</FIELD>
    <FIELD NAME="OrderParty">Individual</FIELD>
    <FIELD NAME="ShipToID">34567</FIELD>
    <FIELD NAME="ShipToAddress1">123 Test Street</FIELD>
    <FIELD NAME="ShipToCity">TestCity</FIELD>
    <FIELD NAME="ShipToState">IL</FIELD>
    <FIELD NAME="ShipTocountry">USA</FIELD>
    <FIELD NAME="TaxNumber">444</FIELD>
    <FIELD NAME="DiscountCode">Summer22</FIELD>
    <SUBTYPE NAME="SubType1">
        <OBJECT NAME="SubType111" ID="-1">
            <FIELD NAME="TestID">-1</FIELD>
            <FIELD NAME="Sequence">1</FIELD>
            <FIELD NAME="ParentSequence">-1</FIELD>
            <FIELD NAME="ExtID">-1</FIELD>
            <FIELD NAME="ExtName">ABC</FIELD>
        </OBJECT>
        <OBJECT NAME="SubType111" ID="-1">
            <FIELD NAME="TestID">-1</FIELD>
            <FIELD NAME="Sequence">2</FIELD>
            <FIELD NAME="ParentSequence">1</FIELD>
            <FIELD NAME="ExtID">-1</FIELD>
            <FIELD NAME="ExtName">DEF</FIELD>
            <FIELD NAME="__ExtendedData">&lt;OBJECT 
         CLASS="Meet123" ID="-1" FULL="FULL" 
         VERSION="1"&gt;&lt;FIELD 
         NAME="OrderDetailID"&gt;-1&lt;/FIELD&gt;&lt;FIELD 
         NAME="OrderID"&gt;-1&lt;/FIELD&gt;&lt;FIELD 
         NAME="Sequence"&gt;0&lt;/FIELD&gt;&lt;FIELD 
         NAME="AttendeeID"&gt;123&lt;/FIELD&gt;&lt;FIELD NAME="AttendeeID_Name"&gt;Test, Mark/I H 
         6&lt;/FIELD&gt;&lt;FIELD 
         NAME="ShowList"&gt;1&lt;/FIELD&gt;&lt;FIELD 
         NAME="BdgeName"&gt;Mark&lt;/FIELD&gt;&lt;FIELD 
         NAME="BadgeCompanyName"&gt;I H 6&lt;/FIELD&gt;
         &lt;/OBJECT&gt;</FIELD>
        </OBJECT>
        <OBJECT NAME="SubType111" ID="-1">
            <FIELD NAME="TestID">-1</FIELD>
            <FIELD NAME="Sequence">3</FIELD>
            <FIELD NAME="ParentSequence">1</FIELD>
            <FIELD NAME="ExtID">-1</FIELD>
            <FIELD NAME="ExtName">GHI</FIELD>
        </OBJECT>
    </SUBTYPE>
    <SUBTYPE NAME="SubType2"/>
    <SUBTYPE NAME="SubType3"/>
</OBJECT>';

DECLARE @ShipToAddress1 VARCHAR(30) = '770 Crown Heights'
    , @TestID INT = 770;

SET @myDoc.modify('replace value of (/OBJECT/FIELD[@NAME="ShipToAddress1"]/text())[1] 
    with sql:variable("@ShipToAddress1")');

SET @myDoc.modify('replace value of (/OBJECT/SUBTYPE/OBJECT[FIELD[@NAME="Sequence"]/text()="1"]/FIELD[@NAME="TestID"]/text())[1] 
    with sql:variable("@TestID")');

SELECT @myDoc;
Parfait
  • 104,375
  • 17
  • 94
  • 125
Yitzhak Khabinsky
  • 18,471
  • 2
  • 15
  • 21
  • Prefect! This worked flawlessly!! Thank you again. Over the weekend, I may be posting 2 more Qs related to addition and deletion respectively if required. Hoping to receive help with them. – vbgp Oct 07 '22 at 19:49
  • Hi there, I have tried multiple options but unable to update AttendeeID in __ExtendedData. I tried with Delete and Insert the entire element, Tried using CROSS Apply for modify. But not having luck. Any suggestions? – vbgp Oct 09 '22 at 00:04
  • You need to ask a separate question. Please keep one single question per post. – Yitzhak Khabinsky Oct 09 '22 at 00:22
  • I have create a new Q. – vbgp Oct 09 '22 at 01:52