В соответствии с этой записью BOL:
Будьте внимательны при указании предложения FROM, чтобы указать критерии для операции обновления.Результаты оператора UPDATE не определены, если он содержит предложение FROM, которое не указано таким образом, чтобы для каждого обновляемого вхождения столбца было доступно только одно значение, то есть если оператор UPDATE не является детерминированным.
Другими словами, если оператор UPDATE
использует предложение FROM
, которое имеет несколько строк, соответствующих критериям для обновления одной строки, неизвестно, какая строка новых данных будет использоваться.В ваших примерах данных неизвестно, был ли результат обновлен по имени в строке с Sequence=2
или Sequence=3
.
Итак, если не имеет значения, какая строка используется для обновления,то, что вы сейчас делаете, будет работать просто отлично.Однако, если это проблема, вам необходимо написать предложения FROM
и WHERE
вашего обновления, чтобы для каждого элемента возвращалась только одна строка, возможно, что-то вроде следующего:
;with insert2 as (
select id, week, sequence, name,
row_number() over(partition by id order by week desc, sequence desc) as [descOrd]
from inserted
)
update p
set p.name = i.name
from product p
join insert2 i on p.id = i.id and p.week = 0 and p.sequence = 1
where i.descOrd=1