Не уверен, что вы хотите сделать здесь.Вы упоминаете функцию TSQL, и если это замена & to &, это не обязательно.Об этом позаботится SQL Server.
Тест с использованием табличной переменной @art
:
declare @art table(parent int, idstr varchar(250), rest xml)
insert into @art values
(160, '123&456', '<root></root>')
update @art
set rest.modify('insert (<e><k>link</k><v>{sql:column("idstr")}</v></e>) into (/root)[1]')
where parent = 160 and
idstr like '%&%'
select rest
from @art
Результат:
<root>
<e>
<k>link</k>
<v>123&456</v>
</e>
</root>
Обновление
В не очень тривиальных ситуациях вы можете использовать перекрестное применение, чтобы получить нужные значения в столбце.
declare @art table(parent int, idstr varchar(250), rest xml)
insert into @art values
(160, '123&456', '<root></root>')
update a
set rest.modify('insert (<e><k>link</k><v>{sql:column("T.X")}</v></e>) into (/root)[1]')
from @art as a
cross apply (select reverse(replace(idstr, '2', '8')+'NotSoTrivial')) as T(X)
where parent = 160 and
idstr like '%&%'
select rest
from @art
Результат:
<root>
<e>
<k>link</k>
<v>laivirToStoN654&381</v>
</e>
</root>