К сожалению, я не знаю какой-либо надежной встроенной функции, которая может дать вам указание, действительно ли значение столбца изменилось, когда оператор обновления запустил триггер.
Однако, есть довольно простооператор select, который вы можете выполнить, чтобы увидеть, какие значения изменились в каких строках:
SELECT IIF(ISNULL(NULLIF(I.Col, D.Col), NULLIF(D.Col, I.Col)) IS NULL, 0, 1) As Col_Updated
FROM Inserted I
JOIN Deleted D
ON I.PrimaryKey = D.PrimaryKey
Функция NULLIF
вернет null
, если оба столбца равны.Если нет, он возвращает значение первого столбца.
Функция ISNULL
вернет первый аргумент, который не является null
или null
, если оба аргумента равны нулю.
Использование ISNULL
в результате двух NULLIF
Функции, в которых значения столбцов обращены, приведут к null
, если значения обоих столбцов одинаковы, даже если они оба равны нулю.Если значения отличаются, даже если одно из них равно нулю, а другое нет, тогда ISNULL
вернет значение.Поэтому все, что вам нужно сделать, это проверить, вернул ли ISNULL
значение или ноль - если он возвращает null
, вы знаете, что значение столбца не изменилось.Если он возвращает значение, то оно изменяется.
Конечно, для столбцов, не допускающих значения NULL, вы можете упростить условие следующим образом:
SELECT IIF(I.Col <> D.Col, 1, 0) As Col_Updated
FROM...
Однако я бы рекомендовал против что, поскольку, если кто-то изменит столбец, чтобы разрешить ноль, код триггера должен будет измениться, чтобы поддержать это - и, по моему опыту, это ошибка, ожидающая возникновения - код триггера, вероятно, не изменится, что приведет к ложному-negatives.
Вы можете увидеть живое демо на rextester.
Обновление
Другой простой метод, который вы можете использовать, это:
IIF((I.Col IS NULL AND D.Col IS NULL) OR (I.Col = D.Col), 0, 1) as IsUpdated.
Этот метод основан на том факте, что сравнение нуля с чем-либо еще приведет к unknown
, что в основном эквивалентно false
.
Это немного более читабельно ИМХО.