Microsoft SQL Server использует устаревшие значения в хранимых процедурах - PullRequest
0 голосов
/ 19 ноября 2011

У меня есть хранимая процедура SQL, которая никогда не заканчивается из-за некоторых значений, которые кэшируются.Но это всего лишь предположение после отладки процедуры.

    while @poid is not NULL
    BEGIN

        Update Item set Sales = (Select Sales from V_ITEM_Hierarchy where POID=@poid) where ItemID=@poid

        Select @poid = i.ItemID
        from V_ITEM_Hierarchy t inner join Item i on (t.POID = i.POID)
        where ( abs(coalesce(t.Sales,0)-coalesce(i.Sales,0)) > 0.0001

    END

Я обновляю значение «Продажи» в элементе таблицы на значение «Продажи» для представления с именем «V_ITEM_Hierarchy», а затем снова ищу значения, которые отличаются,Когда я отлаживаю процедуру, оператор выбора всегда возвращает одно и то же значение, даже если значения Sales больше не отличаются, потому что они были обновлены.

Я попытался вставить команду "DBCC DROPCLEANBUFFERS", но оператор выбора все еще возвращает старые значения.

Ответы [ 2 ]

2 голосов
/ 20 ноября 2011

Если второй запрос не возвращает никаких строк, значение @poid НЕ будет обновлено.Что вам нужно, это

while @poid is not NULL
BEGIN

    Update Item set Sales = (Select Sales from V_ITEM_Hierarchy where POID=@poid) where ItemID=@poid

    set @poid = null

    Select @poid = i.ItemID
    from V_ITEM_Hierarchy t inner join Item i on (t.POID = i.POID)
    where ( abs(coalesce(t.Sales,0)-coalesce(i.Sales,0)) > 0.0001

END
0 голосов
/ 20 ноября 2011

Я думаю, вам было бы гораздо лучше изменить это на курсор, потому что у вас всегда будет возможность бесконечного цикла, как это написано сейчас.

DECLARE @poid INT

DECLARE item_cursor CURSOR FOR
 Select i.ItemID
   from V_ITEM_Hierarchy t inner join Item i on (t.POID = i.POID)
  where ( abs(coalesce(t.Sales,0)-coalesce(i.Sales,0)) > 0.0001

OPEN item_cursor

FETCH NEXT FROM item_cursor INTO @poid
WHILE @@FETCH_STATUS = 0
  BEGIN
     Update Item set Sales = (Select Sales from V_ITEM_Hierarchy where POID=@poid) where ItemID=@poid

    FETCH NEXT FROM item_cursor INTO @poid
  END

DEALLOCATE item_cursor
...