Use of xml.modify to insert parameters into specific element of an xml column Use of xml.modify to insert parameters into specific element of an xml column xml xml

Use of xml.modify to insert parameters into specific element of an xml column


declare @XML xml = '<Profile>  <ID>20</ID>  <User>    <ID>BC4A18CA-AFB5-4268-BDA9-C990DAFE7783</ID>    <Name>somename</Name>    <Activities>      <Activity>         <Name>activity1</Name>      </Activity>    </Activities>  </User></Profile>'declare @user_id nvarchar(50) = '20'declare @activity_name nvarchar(50) = 'activity1'declare @display_name nvarchar(50) = 'displayname1'set @xml.modify('insert <DisplayName>{sql:variable("@display_name")}</DisplayName>                 into (/Profile[ID = sql:variable("@user_id")]                       /User/Activities/                       Activity[Name = sql:variable("@activity_name")])[1]')

Result:

<Profile>  <ID>20</ID>  <User>    <ID>BC4A18CA-AFB5-4268-BDA9-C990DAFE7783</ID>    <Name>somename</Name>    <Activities>      <Activity>        <Name>activity1</Name>        <DisplayName>displayname1</DisplayName>      </Activity>    </Activities>  </User></Profile>


Try this

declare @ins xml     '<Activity><Name>'+    @activity_name+    '</Name><DisplayName>'    +@display_name+    '</DisplayName></Activity>'SET @devices_xml.modify('    insert sql:variable("@ins") into (/Profile[ID=sql:variable("@user_id")]/User/Activities)[1]')

Or

SET @devices_xml.modify('      insert <Activity>             <Name>{sql:variable("@activity_name")}</Name>             <DisplayName>{sql:variable("@display_name")}</DisplayName>             </Activity>       into (/Profile[ID=sql:variable("@user_id")]/User/Activities)[1]'    )


Not sure I fully understand your logic, but you can insert into xml using sql:variable with curly brackets eg

DECLARE @profiles_xml xmlset @profiles_xml = '<Profile>  <ID>20</ID>  <User>    <ID>BC4A18CA-AFB5-4268-BDA9-C990DAFE7783</ID>    <Name>somename</Name>    <Activities>      <Activity>         <Name>activity1</Name>      </Activity>    </Activities>  </User></Profile>'SELECT 'before' s, DATALENGTH(@profiles_xml) dl, @profiles_xmlDECLARE @user_id CHAR(36), @activity_name NVARCHAR(MAX), @display_name NVARCHAR(MAX)SELECT @user_id = 'BC4A18CA-AFB5-4268-BDA9-C990DAFE7783', @activity_name = 'TEST ACTIVITY NAME', @display_name = 'TEST DISPLAY NAME'SET @profiles_xml.modify('    insert <Activity><Name>{sql:variable("@activity_name")}</Name><DisplayName>{sql:variable("@display_name")}</DisplayName></Activity>    as first    into (/Profile/User/Activities)[1]')SELECT 'after' s, DATALENGTH(@profiles_xml) dl, @profiles_xml