Вы должны проверить Руководство Erland по обработке ошибок
В этом инклюзивном руководстве предлагается изменить как минимум CATCH
на
BEGIN CATCH
IF @@trancount > 0 ROLLBACK TRANSACTION --roll back the tran
DECLARE @msg nvarchar(2048) = error_message() --error message is usually more helpful
DECLARE @ErrorNumber INT = ERROR_NUMBER();
DECLARE @ErrorLine INT = ERROR_LINE();
RAISERROR(@msg,16,1) --RAISE the error
RETURN 55555 --return a non-zero to application as non-success
END CATCH
Там гораздо больше, поэтому стоит прочитать.
Я почти забыл, SET XACT_ABORT, NOCOUNT ON
на вершине вашего процесса.
Когда вы активируете XACT_ABORT ON, почти все ошибки имеют одинаковые
эффект: любая открытая транзакция откатывается и выполнение прерывается.
Есть несколько исключений, из которых самым выдающимся является
RAISERROR заявление.
Обратите внимание, что «печать» ошибки не сохранит и не сохранит ее в любом месте, как журнал ошибок SQL Server, так что вы вообще не «поймаете» ее.