@@ERROR
сбрасывается в 0 при проверке. Зачем? Потому что он отражает статус последнего выполненного оператора.
IF @@ERROR <> 0 ...
является оператором, и этот оператор успешно выполняется, в результате чего @@ERROR
устанавливается на 0.
Правильный способ проверки и обработки значений @@ERROR
заключается в следующем:
DECLARE @ErrorCode INT
INSERT INTO Table ...
SET @ErrorCode = @@ERROR
IF @ErrorCode <> 0
BEGIN
INSERT INTO ErrorLog (ErrorCode, Message)
VALUES (@ErrorCode, 'The INSERT operation failed.')
END