我的Update语句正在之前声明的INSERT INTO之前处理

时间:2012-03-09 16:41:35

标签: sql tsql sql-update execution-time

我正在尝试使用新值更新37k记录,但在此之前,我正在尝试输入审计跟踪记录以记录以前的值。我遇到的是Update命令,即使在INSERT INTO命令之后,INSERT INTO命令的“Previous Value”显示新值。看来正在首先处理更新命令。

WHILE @iLP <=@cntDeal_SD
BEGIN
-- History Change
SET @PrevSettleDate=(SELECT SettleDate FROM Deal WHERE DealID=@Deal_ID)

INSERT INTO History
    (ItemKey,LoginID,TimeStamp,HowChanged,FieldChanged,PreviousValue,NewValue,Comment,Created)
    VALUES ('CDeal' + CAST(@Deal_ID AS varchar(10)),1,GETDATE(), 'M','SettleDate', ISNULL(@PrevSettleDate,'NULL'), '3/02/2012', 'TSR5691', 0)


-- Record Change 
SET @Deal_ID = (SELECT DealID FROM @tblDeal_SD WHERE Row = @iLP)
UPDATE Deal SET SettleDate = '3/02/2012' WHERE DealID=@Deal_ID


SET @iLP=@iLP + 1
END

[编辑] 刚刚意识到我的SET @Deal_ID语句落在我的INSERT INTO之后。

虽然我之前已经意识到我需要在UPDATE之前发布INSERT INTO,但我没有移动SET语句,所有内容都是基于。

我的坏。

2 个答案:

答案 0 :(得分:1)

不,问题在于你;

  • 从Deal @Deal_ID读取@PrevSettleDate。
  • 将@PrevSettleDate写入交易历史记录@Deal_ID - 到目前为止一直很好。
  • 更新@Deal_ID以指向 下一步 交易 - 这是您出错的地方。
  • 更新 下一个 交易日期。
  • 回到开头,从刚更新的交易中读取PrevSettleDate ...

如果将@Deal_ID的更新移动到循环的开头,那么事情应该可以正常工作。

答案 1 :(得分:0)

我将使用update语句的OUTPUT子句。这样可以将旧值保存到表变量中,甚至可以直接保存到历史表中。您可以通过这种方式立即执行所有更新。

http://msdn.microsoft.com/en-us/library/ms177564.aspx