Microsoft SQL Server在存储过程中使用过期值

时间:2011-11-19 19:55:00

标签: sql sql-server sql-server-2008 stored-procedures

我有一个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语句仍然返回旧值。

2 个答案:

答案 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