Как упоминал Крис, вы должны быть осторожны с откатом транзакции.
В частности это:
IF @@TRANCOUNT > 0 ROLLBACK
не всегда то, что вы хотите. Вы могли бы сделать что-то вроде этого
IF(@@TRANCOUNT = 1) ROLLBACK TRAN
ELSE IF(@@TRANCOUNT > 1) COMMIT TRAN
RETURN @error
Таким образом, вызывающий процесс может проверить возвращаемое значение из хранимой процедуры и определить, хочет ли он все равно зафиксировать или продолжать выдавать ошибку.
Причина в том, что COMMIT просто уменьшит счетчик транзакций. Как только он уменьшает счетчик транзакций до нуля, происходит фактическое принятие.