Я бы обменял пространство на время и не делал сравнения. Просто вставьте новые значения в таблицу аудита при вставке / обновлении. Диск дешевый.
Кроме того, я не уверен, что хранимая процедура покупает вас. Разве вы не можете сделать что-то простое в триггере, как:
insert into dbo.mytable_audit
(select *, getdate(), getdate(), 'create' from inserted)
Где триггер работает при вставке, и вы добавляете поля времени создания, времени последнего обновления и типа модификации. Для обновления это немного сложнее, так как вам нужно предоставить именованные параметры, так как время создания не должно обновляться
insert into dbo.mytable_audit (col1, col2, ...., last_updated, modification)
(select *, getdate(), 'update' from inserted)
Кроме того, вы планируете проверять только успехи или неудачи? Если вы хотите проверять сбои, вам понадобится нечто иное, чем триггеры, я думаю, так как триггер не будет запущен, если транзакция откатывается - и у вас не будет статуса транзакции, если триггер запускается первым.
Я фактически переместил аудит на уровень доступа к данным и теперь делаю это в коде. Это облегчает как аудит успеха, так и неудачи, и (используя отражение) довольно легко копировать поля в объект аудита. Еще одна вещь, которую он позволяет мне сделать, это дать пользователю контекст, так как я не даю фактические пользовательские разрешения для базы данных и не выполняю все запросы с использованием учетной записи службы.