• Currently this code is randomising the Accrualdate as there is no ORDER BY when populating the cursor:

    Can you explain the purpose of this code?

    DECLARE @Counter INT = 0

    DECLARE @VirtualID INT

    DECLARE @VirtualID_cur CURSOR

    SET @VirtualID_cur = CURSOR FOR

    SELECT VirtualID FROM [trn].[temp_tblMonthlyAccruals]

    OPEN @VirtualID_cur

    FETCH NEXT

    FROM @VirtualID_cur INTO @VirtualID

    WHILE @@FETCH_STATUS = 0

    BEGIN

    PRINT @VirtualID

    UPDATE [trn].[temp_tblMonthlyAccruals]

    SET [AccrualDate] = DATEADD(dd, @Counter, '31-May-2013')

    WHERE VirtualID = @VirtualID

    SET @Counter = @Counter - 1

    FETCH NEXT FROM @VirtualID_cur INTO @VirtualID

    END

    CLOSE @VirtualID_cur

    DEALLOCATE @VirtualID_cur

    I'm guessing the above code is designed to replace this:

    WHILE EXISTS( SELECT [AccrualDate],

    [Counterparty],

    [ProfitCenter],

    [CostName],

    [AccrualCurrency]

    FROM [trn].[temp_tblMonthlyAccruals]

    GROUP BY [AccrualDate],

    [Counterparty],

    [ProfitCenter],

    [CostName],

    [AccrualCurrency]

    HAVING count(*) > 1)

    BEGIN

    SET ROWCOUNT 1

    UPDATE [trn].[temp_tblMonthlyAccruals]

    SET [AccrualDate] = DATEADD(D, -1, [AccrualDate]) --changed day to d

    FROM [trn].[temp_tblMonthlyAccruals] ma1

    WHERE [AccrualDate] = ma1.[AccrualDate]

    AND EXISTS(SELECT [AccrualDate],

    [Counterparty],

    [ProfitCenter],

    [CostName],

    [AccrualCurrency]

    FROM [trn].[temp_tblMonthlyAccruals] ma2

    WHERE ma1.[AccrualDate]=ma2.[AccrualDate]

    and ma1.[Counterparty]=ma2.[Counterparty]

    and ma1.[ProfitCenter]=ma2.[ProfitCenter]

    and ma1.[CostName]=ma2.[CostName]

    and ma1.[AccrualCurrency]=ma2.[AccrualCurrency]

    GROUP BY ma2.[AccrualDate],

    ma2.[Counterparty],

    ma2.[ProfitCenter],

    ma2.[CostName],

    ma2.[AccrualCurrency]

    HAVING count(*) > 1

    )

    SET ROWCOUNT 0

    END