• Hi Jeff,

    Quick Update,

    I remove using the temp variable and used temp table instead. It took 31 seconds. Do you have any suggestion to spreed up still?

    my latest try,

    Declare @CompID int = 1050;

    BEGIN

    -- Check if any data available to be processed

    IF EXISTS (

    SELECT TOP 1 IDcompAFR

    FROM Comp_Detail

    WHERE CompID = @CompID

    AND coalesce(processStatus, 0) = 0

    )

    BEGIN

    BEGIN TRY

    -- Set it so if the first UPDATE fails, we won't even start the second update.This really says "If we're in a transaction

    -- and something fails, stop processing the transaction and do a rollback if we can".

    SET XACT_ABORT ON;

    --Create a table to remember the rows we updated.

    IF OBJECT_ID('tempdb..#ActualData') IS NOT NULL

    BEGIN

    DROP TABLE #ActualData;

    END

    IF OBJECT_ID('tempdb..#AffecedRecords') IS NOT NULL

    BEGIN

    DROP TABLE #AffecedRecords;

    END

    CREATE TABLE #ActualData(UserId BIGINT

    ,IDcompAFR BIGINT

    ,ProcessingAmount MONEY);

    Create table #AffecedRecords (UserId BIGINT);

    -- temp variable to hold the actual data. this will be used to get IdcompanyOFR once the balance updated

    --DECLARE @ActualData TABLE (

    --UserId BIGINT

    --,IDcompAFR BIGINT

    --,ProcessingAmount MONEY

    --);

    -- table variable to capture the Affected UserId's

    --DECLARE @AffecedRecords TABLE (UserId BIGINT);

    BEGIN TRANSACTION;

    -- Get the whole data to be processed.

    INSERT INTO #ActualData (

    UserId

    ,IDcompAFR

    ,ProcessingAmount

    )

    SELECT UserId

    ,IDcompAFR

    ,ProcessingAmount = COALESCE(TransferAmount, 0)

    FROM Comp_Detail

    WHERE CompID = @CompID

    AND coalesce(processStatus, 0) = 0

    ;

    -- Aggregare the ProcessingAmount based on UserId

    WITH AggregateData

    AS (

    SELECT UserId

    ,ProcessingAmount = SUM(COALESCE(ProcessingAmount, 0))

    FROM #ActualData

    GROUP BY UserId

    )

    --Do the balance update and capture the UserId that are affected.

    UPDATE UB

    SET UB.Amount_Available = COALESCE(UB.Amount_Available, 0) + AD.ProcessingAmount

    ,UB.Amount_Pend = COALESCE(UB.Amount_Pend, 0) - AD.ProcessingAmount

    ,LastModDt = getdate()

    OUTPUT deleted.UserId

    INTO #AffecedRecords(UserId)

    FROM User_bank UB

    INNER JOIN AggregateData AD ON UB.UserId = AD.UserId;

    --===== Using the captured UserId get the IDcompAFR from @ActualData temp variable

    -- and then update the processStatus = 1

    --- means OFR processed for the trip .

    UPDATE Comp_Detail

    SET processStatus = 1

    ,AmtTransferDate = getdate()

    WHERE IDcompAFR IN (

    SELECT DISTINCT AD.IDcompAFR

    FROM #ActualData AD

    INNER JOIN #AffecedRecords AR ON (AD.UserId = AR.UserId)

    )

    AND processStatus = 0;

    COMMIT TRANSACTION;

    END TRY

    BEGIN CATCH

    DECLARE @ErrorMessage NVARCHAR(4000);

    DECLARE @ErrorSeverity INT;

    DECLARE @ErrorState INT;

    DROP TABLE #ActualData;

    DROP TABLE #AffecedRecords;

    SELECT @ErrorMessage = ERROR_MESSAGE()

    ,@ErrorSeverity = ERROR_SEVERITY()

    ,@ErrorState = ERROR_STATE();

    ROLLBACK TRANSACTION;

    RAISERROR (

    @ErrorMessage

    ,@ErrorSeverity

    ,@ErrorState

    );

    END CATCH;

    END

    END

    GO

    --select * from Comp_Detail

    --select * from User_bank