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
¿Fue útil?

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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top