Puedo reversión de la Dinámica de SQL en SQL Server / TSQL
-
13-09-2019 - |
Pregunta
Se puede correr un sql dinámico en una transacción y revertir el uso de EXEC:
exec('SELECT * FROM TableA; SELECT * FROM TableB;');
Poner esto en una Transacción y el uso de la @@error después de la instrucción exec para hacer las recuperaciones.
por ejemplo.Código
BEGIN TRANSACTION
exec('SELECT * FROM TableA; SELECT * FROM TableB;');
IF @@ERROR != 0
BEGIN
ROLLBACK TRANSACTION
RETURN
END
ELSE
COMMIT TRANSACTION
Si hay n sentencias sql dinámicas y el error se produce en n/2 será la primera de 1 a ((n/2) - 1) las declaraciones que se deshace
Preguntas acerca de la primera respuesta
@@Error no se levante el error más probable Lo que significa que puede no recoger el error, lo que significa que una transacción puede cometer?Que derrota el propósito
TRY/CATCH en SQL Server 2005+ Sí, yo estoy usando SQL Server 2005, pero no se usa el Try Catch antes de Sería hacer la siguiente hacer el truco
BEGIN TRANSACTION
BEGIN TRY
exec('SELECT * FROM TableA; SELECT * FROM TableB;');
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
O he mirado algunos ejemplos más en la red
BEGIN TRY --Start the Try Block..
BEGIN TRANSACTION -- Start the transaction..
exec('SELECT * FROM TableA; SELECT * FROM TableB;');
COMMIT TRAN -- Transaction Success!
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRAN --RollBack in case of Error
RAISERROR(ERROR_MESSAGE(), ERROR_SEVERITY(), 1)
END CATCH
Solución
Sí. Los txns pertenecen a la sesión actual / conexión y SQL dinámico utiliza el mismo contexto.
Sin embargo, @@ ERROR no recoger el error más probable: el estado tiene que ser comprobada inmediatamente después de la declaración infractor. Que haría uso de try / catch, en el supuesto de SQL Server 2005 +
Edit: El try / catch debería funcionar bien
.Otros consejos
No tome nuestra palabra de que intente captura va a funcionar, probar por sí mismo. Dado que este es SQL dinámico lo más fácil de hacer es la primera declaración correcta (y por supuesto que mneeds a la actualización de la haba, insertar o eliminar o no hay necesidad de unaTransacción) y luego hacer un error de sintaxis deliberada en el segundo DECLARACIÓN. A continuación, prueba de que la actualización de insertar o eliminar en la primera DECLARACIÓN pasó.
También quiero señalar que SQL dinámico como regla es una mala práctica. ¿Esto realmente necesita ser dinámico?