Solo abra una transacción una vez que esté dentro del TRY bloque y justo antes de la declaración real, y confirme de inmediato. No espere a que su control llegue al final del lote para comprometer sus transacciones.
Si algo sale mal mientras estás en TRY bloque y ha abierto una transacción, el control saltará a CATCH cuadra. Simplemente retroceda su transacción allí y realice otro manejo de errores según sea necesario.
He agregado un pequeño cheque para cualquier transacción abierta usando @@TRANCOUNT antes de revertir la transacción. Realmente no tiene mucho sentido en este escenario. Es más útil cuando realiza algunas comprobaciones de validación en su TRY bloquear antes de abrir una transacción como verificar valores de parámetros y otras cosas y generar un error en TRY bloquear si alguna de las comprobaciones de validación falla. En ese caso, el control saltará a CATCH bloque sin siquiera abrir una transacción. Allí puede verificar cualquier transacción abierta y revertir si hay alguna abierta. En su caso, realmente no necesita verificar ninguna transacción abierta ya que no ingresará el CATCH bloquear a menos que algo salga mal dentro de su transacción.
No preguntes después de haber ejecutado DELETE operación si necesita ser confirmada o revertida; haga todas estas validaciones antes de abrir la transacción. Una vez que se abre una transacción, confírmela de inmediato y, en caso de errores, realice el manejo de errores (está haciendo un buen trabajo al obtener información detallada mediante el uso de casi todas las funciones de error).
BEGIN TRY
BEGIN TRANSACTION SCHEDULEDELETE
DELETE -- delete commands full SQL cut out
DELETE -- delete commands full SQL cut out
DELETE -- delete commands full SQL cut out
COMMIT TRANSACTION SCHEDULEDELETE
PRINT 'X rows deleted. Operation Successful Tara.' --calculation cut out.
END TRY
BEGIN CATCH
IF (@@TRANCOUNT > 0)
BEGIN
ROLLBACK TRANSACTION SCHEDULEDELETE
PRINT 'Error detected, all changes reversed'
END
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage
END CATCH