【发布时间】:2023-01-18 16:36:57
【问题描述】:
CREATE TABLE sales
(id INT PRIMARY KEY IDENTITY, name VARCHAR(30),
percent_part FLOAT, sales FLOAT, sum_bonus DECIMAL);
CREATE TRIGGER TRcointingBonus ON sales
AFTER UPDATE
AS BEGIN
DECLARE @sum_bonus FLOAT;
SELECT @sum_bonus = (SELECT ((sales / 100) * percent_part) FROM sales);
UPDATE sales SET sum_bonus = @sum_bonus
END;
INSERT INTO sales VALUES('staff1', 7.0, 7088, 1);
INSERT INTO sales VALUES('staff2', 3.5, 20590, 1);
INSERT INTO sales VALUES('staff3', 10.5, 6089, 1);
UPDATE sales SET sales = 7088 WHERE id=1;
我创建一个表和一个触发器,对于每个UPATE操作,sum_bonus的每一行都会有计算。
问题是在
DECLARE @sum_bonus FLOAT;
SELECT @sum_bonus = (SELECT ((sales / 100) * percent_part) FROM sales);
如果删除FROM sales,则将无法写入变量。能解释一下是什么原因,如何在不放弃变量的情况下解决这个问题?
【问题讨论】:
-
您确定要读取表中的所有行、计算总奖金然后更新表中的所有行吗?您不想在更新的行上工作吗?旧值在
deleted.sales/deleted.percent_part,新值在inserted.sales/inserted.percent_part。但是,您似乎正试图在这里做一些您不应该做的事情。您只是想根据行的值计算行的奖金吗?那么您可能只需要一个计算列。 -
不要滥用触发器进行简单的计算。计算仅从同一个表的列中获取值,因此不需要触发器。只需在更新命令中进行计算即可。或者让应用程序计算它并将结果写入更新命令。
-
@ThorstenKettner 如果我写
UPDATE sales SET sum_bonus = (SELECT (sales / 100) * procent)一切正常,我的问题是为什么FROM sales会中断查询。我试图创建另一个表,同样的查询也不起作用