Он все время добавляет это к первому значению tr из-за
(/root/tr)[1]
Вы говорите, чтобы добавить его к первому элементу tr, найденному под корневым элементом.
Что-токак это будет сделано для первого найденного tr, который имеет 12-й тд со значением 58:
SET @xml.modify('insert
attribute style {"background-color: #FF8B6F;"}
into (//tr[(td[12])/text()="58"])[1] ')
Это будет работать только для первого найденного, но это должно помочь вам начать.Вам нужно создать цикл, чтобы получить все из них.Если вы создаете цикл и хотите, чтобы конечный индексатор был динамическим, вам нужно будет обернуть все в sp_executesql и запустить его как одну команду.Если вы попытаетесь сделать что-то вроде:
SET @xml.modify('insert
attribute style {"background-color: #FF8B6F;"}
into (//tr[(td[12])/text()="58"])[' + @val + '] ')
, произойдет сбой, потому что .modify требует строкового литерала.Поэтому вам нужно сделать что-то вроде
declare @command nvarchar(1000)
declare @int int = 1
SET @command = '
SET @xml.modify(''insert
attribute style {"background-color: #FF8B6F;"}
into (//tr[(td[12])/text()="58"])[' + CAST(@int AS nvarchar(6)) + '] '') '
EXEC sp_executesql @stmt = @command,
@params = N'@xml xml out',
@xml = @xml OUTPUT
SELECT @xml
Где переменная @int является вашей переменной-счетчиком.