我有一个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值更新Table Item中的值“Sales”,然后再次查看不同的值。当我通过该过程进行调试时,即使Sales值因为更新而不再相同,select-statement也会返回相同的值。
我尝试插入命令“DBCC DROPCLEANBUFFERS”,但select语句仍然返回旧值。
答案 0 :(得分:2)
如果第二个查询没有返回任何行,则不会更新@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
答案 1 :(得分:0)
我认为将这个更改为游标会更好,因为你总是可以像现在这样编写无限循环。
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