Error al realizar una transacción

publicado por: Anonymous

Tengo que hacer que en un intervalo de tiempo se guarden en unas tablas una serie de registros, pero si alguna de las inserciones falla entonces tengo que hacer un rollback de todo.
Para ello tengo un procedimiento almacenado que inserta para un día determinado los datos en las tablas correspondientes
PROC_INSERTA_ASIGNACION que resumido es

BEGIN   
SET NOCOUNT ON;
BEGIN TRY

    set @error = 1
    Insert into ... 
    set @error = 2      
    Insert into ..
    set @error = 3
    Insert into ...
    set @error = 4
    Insert into ...

END TRY
BEGIN CATCH 
        Select @ErrorMessage = ERROR_MESSAGE()      
        set @p_error = @error           
        exec Alta_Log @error,GETUTCDATE,@ErrorMessage
        return
END CATCH

Como se ve, si falla algo llama a un procedimiento para guardar el registro en el log

Luego el cogido principal que es el que llama a este procedimiento n veces es el siguiente:

BEGIN TRANSACTION
                BEGIN TRY
                    While (@dt_aux_fin != @dt_aux)
                        begin
                            exec PROC_INSERTA_ASIGNACION  @dt_aux, @jornada, @hora, 1, @sector, @tipo_sector, @p_error
                            if (@p_error > 0)
                            THROW 51000, 'ERROR EN PROC_INSERTA_ASIGNACION @repeticion = 1', 1

                        Select @dt_aux = dateadd(day,1,@dt_aux)
                        end



                COMMIT TRANSACTION
            END TRY 
            BEGIN CATCH
            Select @ErrorMessage = ERROR_MESSAGE()  
            set @cod_error = @p_error

                IF @@TRANCOUNT > 0
                    ROLLBACK TRANSACTION;
                    exec Alta_Log @error,GETUTCDATE,@ErrorMessage
            END CATCH

Cuando hago las pruebas me salta al CATCH en

exec PROC_INSERTA_ASIGNACION  @dt_aux, @jornada, @hora, 1, @sector, @tipo_sector, @p_error

y me da el error The current transaction cannot be committed and cannot support operations that write to the log file. Roll back the transaction.

No se que estoy haciendo mal, o quizás sea un problema de enfoque, si alguien me puede ayudar le estaría agradecido, Gracias.

solución

Creo que el problema lo tiene en esta llamada:

 exec PROC_INSERTA_ASIGNACION  @dt_aux, @jornada, @hora, 1, @sector, @tipo_sector, @p_error

Tal como entiendo la lógica, estás esperando que PROC_INSERTA_ASIGNACION devuelva un código de error en @p_error sin embargo no lo estás considerando un parámetro de salida, por lo que el valor, entiendo, será siempre NULL, por lo que nunca se ejecutará el THROW 51000, 'ERROR EN PROC_INSERTA_ASIGNACION @repeticion = 1', 1.

Debieras invocar el sp de esta forma:

exec PROC_INSERTA_ASIGNACION  @dt_aux, @jornada, @hora, 1, @sector, @tipo_sector, @p_error = @p_error OUTPUT

y obviamente debieras declarar dicho parámetro como del tipo OUTPUT

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *