0

I am trying to save log details to a table in SQL. I want to catch both success and errors during SQL operations. Even when there is an SQL exception occured, I want to feed that as well.

I have set up an output parameter, and depending on whether it's success or error, its value changes. While calling this SP I'm getting an error like

Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 0, current count = 1. A transaction that was started in a MARS batch is still active at the end of the batch. The transaction is rolled back

Below is the complete SP.

ALTER PROCEDURE [dbo].[Proc_PIP_Employee]
    @Flag int,
    @Empid int,
    @Name varchar(500),
    @Designation varchar(200),
    @Department varchar(200),
    @DateofJoin datetime,
    @Phone varchar(10),
    @Isactive int,
    @LoginUser nvarchar(500),
    @ReturnId int output

AS
BEGIN
    SET NOCOUNT ON ;
     DECLARE @errorMessage VarChar(8000), 
                @errorSeverity Int,
                @errorState Int,
                @AlCode varchar(50),
                @AlDesc varchar(1000),
                @AlOp varchar(50),
                @AlStatus varchar(50)
    BEGIN TRY
    BEGIN TRANSACTION

        IF (@Flag = 1)
        BEGIN
            IF EXISTS (SELECT 1 FROM dbo.PIP_Employee 
                       GROUP BY Name, Phone 
                       HAVING COUNT(ID) > 0 
                          AND Name = @Name AND Phone = @Phone)
            BEGIN
                SET @ReturnId = 0
                SET @AlCode = 'ERR_1001'
                SET @AlDesc = CONCAT('Add Record of ',@Name,' failed due to duplicate entry')
                SET @AlOp = 'ADD'
                SET @AlStatus = 'ERROR'
                GOTO AuditLog
            END
            ELSE
            BEGIN
                INSERT INTO dbo.PIP_Employee (Name, Designation, Department, DateofJoin, Phone, IsPresent) 
                VALUES (@Name, @Designation, @Department, @DateofJoin, @Phone, @Isactive)

                SET @ReturnId = 1
                  SET @AlCode = 'SUCC_1002'
                SET @AlDesc = CONCAT('Record of ',@Name,' added Successfully')
                SET @AlOp = 'ADD'
                SET @AlStatus = 'SUCCESS'
                GOTO AuditLog

            END

            return @ReturnId
        END

        COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        SET @ReturnId = 0
        SET @AlCode = ERROR_SEVERITY()
        SET @AlDesc = ERROR_MESSAGE()
        SET @AlOp = 'SQL TRANSACTION FAILURE'
        SET @AlStatus = ERROR_STATE();

        IF (@@trancount > 0)
            ROLLBACK TRANSACTION

            GOTO AuditLog 
            RETURN @ReturnId 

    END CATCH

    AuditLog:
    INSERT INTO dbo.PIP_AuditLog (Aud_Code, Aud_Desc, Aud_Operation, Aud_Status, Aud_Createddate, Aud_ActionBy) 
    VALUES (@AlCode, @AlDesc, @AlOp, @AlStatus, GETDATE(), @LoginUser)


    SET NOCOUNT OFF
END

yacc
  • 2,915
  • 4
  • 19
  • 33
Ann
  • 17
  • 2
  • Can you try adding commit transaction after the insert statement in AuditLog. May be when the control comes to this section, the previous transaction is open – Prateek Kumar Dalbehera May 09 '20 at 20:10
  • Does this answer your question? [Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 1, current count = 0](https://stackoverflow.com/questions/21930156/transaction-count-after-execute-indicates-a-mismatching-number-of-begin-and-comm) – yacc May 11 '20 at 02:12
  • issue solved after adding commit transact after insert statement in auditlog. thank you prateek. – Ann May 11 '20 at 19:32

0 Answers0