繁体   English   中英

如何使用触发器正确更新值?

[英]How do I correctly update values with a trigger?

我有一个包含列QtySold_DayQtySold_YesterdayProducts表,其中分别包含有关今天和昨天的已售产品数量的信息。

我想创建一个触发器,每当尝试更新QtySold_Day列时,它将每个值从QtySold_Day列移动到QtySold_Yesterday

这是我已经拥有的:

create or alter trigger UpdateQuantity 
on Products
instead of update
as
    declare @x int
    set nocount on

    while (@x < @@ROWCOUNT)
    begin
        update Products 
        set QtySold_Day = QtySold_Yesterday 
        where (ProductID = @x)
    end

我想知道如何完成触发器以使其按预期工作。

  1. SQL 是一种基于集合的语言,因此您应该始终尝试基于集合的操作。 在触发器内,您可以访问名为Inserted的伪表,其中包含更新的新详细信息。 因此,您可以在一个 go 中更新所有相关记录。
  2. 正如所评论的那样,如果记录被多次更新,您可能需要一种方法来避免复制值 - 所以我添加了一个检查以确保它只发生一次。 这可能不是你想要的行为,所以如果你澄清我们可以调整它。
  3. 你真的想要一个INSTEAD OF触发器吗? 因为这将捕获对该表的所有更新,并且在大多数情况下什么都不做。
UPDATE Products SET
    QtySold_Day = QtySold_Yesterday 
WHERE ProductID IN (SELECT ID FROM Inserted)
-- Only update once
AND QtySold_Yesterday IS NULL;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM