SET XACT_ABORT ON;
DECLARE @_IsUseTrans BIT = 0
DECLARE @_SavePoint NVARCHAR(32) = 'SavePoint_Name';
DECLARE @errNumber INT, @errSeverity INT, @errState INT,
@errProc NVARCHAR(256), @errLine INT, @errMessage NVARCHAR(MAX);
BEGIN TRY
IF @@TRANCOUNT = 0
BEGIN
BEGIN TRANSACTION;
SET @_IsUseTrans = 1;
END ELSE
SAVE TRANSACTION @_SavePoint;
/* T-SQL */
IF @_IsUseTrans = 1
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
SELECT @errNumber = ERROR_NUMBER(),
@errSeverity = ERROR_SEVERITY(),
@errState = ERROR_STATE(),
@errProc = ERROR_PROCEDURE(),
@errLine = ERROR_LINE(),
@errMessage = ERROR_MESSAGE();
IF XACT_STATE() = -1
BEGIN
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END ELSE
BEGIN
IF @_IsUseTrans = 1
BEGIN
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END
ELSE
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION @_SavePoint;
END
RAISERROR('%s (Proc: %s, Line: %d)', @errSeverity, @errState, @errMessage, @errProc, @errLine);
GOTO DROP_TEMPORARY_TABLE;
END CATCH