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