我有一个Products
表,其中QtySold_Day
和QtySold_Yesterday
列分别包含今天和昨天的销售数量信息。
我想创建一个触发器,每当尝试更新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
我想知道如何完成触发器,使其按预期工作。
- SQL是一种基于集合的语言,因此您应该始终尝试基于集合的操作。在触发器内部,您可以访问一个名为
Inserted
的伪表,其中包含更新的新详细信息。因此,您可以一次更新所有相关记录。 - 正如评论,你可能需要一种方法来避免复制的值,如果记录更新多次-所以我已经添加了一个检查,以确保它只发生一次。这可能不是你想要的行为,所以如果你澄清,我们可以调整它。 你真的想要一个
INSTEAD OF
触发器吗?因为这会捕获所有UPDATE Products SET
QtySold_Day = QtySold_Yesterday
WHERE ProductID IN (SELECT ID FROM Inserted)
-- Only update once
AND QtySold_Yesterday IS NULL;