Deshacer todo el inserto sql si algo fallaEstoy tratando de ejecutar varias inserciones en diferentes tablas y quiero que todas se restituyan si algo falla. Ahora tengo el código sql funcionando y está retrocediendo correctamente, pero no está generando el error sobre odbc. JMP simplemente devuelve un valor perdido. ¿Alguien sabe cómo asegurarse de que el raiserror () se muestre correctamente sobre ODBC? Plantea el error correctamente si ejecuto el mismo código directamente en SQL.
dbc = Create database connection("DRIVER=SQL SERVER;SERVER=.\;Database=Test");
rfail = executeSQL(dbc,
"
DECLARE @TransactionName varchar(20) = 'Transaction1';
BEGIN TRY
BEGIN TRAN @TransactionName
INSERT INTO [dbo].Test1
(A --varchar
,B --Int
)
VALUES
('Test Fail'
,1
)
DECLARE @ID bigint
SELECT @ID = SCOPE_IDENTITY()
INSERT INTO [dbo].Test2
(T1ID --Test1 ID
,A --varchar
)
VALUES
(@ID
,14
)
COMMIT TRAN @TransactionName
END TRY
BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
IF @@TRANCOUNT > 0
ROLLBACK TRAN @TransactionName
SELECT
@ErrorMessage=ERROR_MESSAGE(),
@ErrorSeverity=ERROR_SEVERITY(),
@ErrorState=ERROR_STATE();
RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState)
END CATCH
",
);
close database connection(dbc);
Re: Rollback toda la inserción sql si algo falla @vince_faller Todavía me considero un "hacker" de SQL, así que de ninguna manera soy un experto. Solo mirando su SQL y sabiendo que un BEGIN TRAN termina con un COMMIT TRAN o un ROLLBACK TRAN, tal vez la sección SELECT de SQL para capturar los mensajes de error debería aparecer antes del ROLLBACK.
Esto es sólo una suposición salvaje. Por favor, publique si encuentra una solución.
Re: Rollback toda la inserción sql si algo fallaSin amor. Aún no recupero nada.
Re: Rollback toda la inserción sql si algo fallaEsta es una solución rudimentaria, pero antes de realizar la transacción, inserte un valor en una tabla de estado como "Procesando" y confírmelo.
Entonces haz tu transacción. Después de realizar la confirmación, cambie el valor de la tabla de estado a "Hecho". Si sus transacciones fallan y usted salta a la sección de reversión, su tabla de estado aún mostrará "Procesando". Así que después de la llamada para sus transacciones principales verifique su tabla de estado. Si aún dice "Procesando", sabrá que se realizó una reversión.