您需要停下来重新开始。
首先,您需要赶上AFTER UPDATE
事件 - 而不是插入 - 因为您想在薪水更新时(现有值替换为更高的值)执行某些操作。
其次,触发器就会被调用一次每UPDATE
声明,如果UPDATE
影响超过一个排,Deleted
和Inserted
伪表将包含多行数据 - 让你的SELECT @Salary = salary FROM Inserted
声明注定 - 它会取一个任意排并忽略所有可能受到影响的其他人。
在UPDATE
情况下,Inserted
将具有新值(更新之后),而Deleted
具有旧值(更新之前) - 所以这两个伪表之间的差异可被用于图如果出工资增幅超过了20%!
CREATE TRIGGER trBusDriverSalaryIncrease
ON dbo.Bus_Driver
AFTER UPDATE
AS
BEGIN
-- declare a table variable to hold all revelant values
DECLARE @RelevantIncreases TABLE (drNo INT, StationNo INT, SalaryIncrease DECIMAL(18,2))
-- find those bus drivers who have had a more than 20% increase in their salary
INSERT INTO @relevantIncreases (drNo, StationNo, SalaryIncrease)
SELECT
i.drNo, i.StationNo, -- Driver and Station No
(i.Salary - d.Salary) -- Salary increase in absolute numbers
FROM
Deleted d
INNER JOIN
Inserted i ON d.drNo = i.drNo
WHERE
-- Salary increased by more than 20%
i.Salary > 1.2 * d.Salary
-- now that we have all the relevant bus drivers and their salary increase
-- insert this into the Station.Salary_Commission column
UPDATE s
SET Salary_Commission = s.Salary_Commission + ri.SalaryIncrease * 0.0005
FROM dbo.Station s
INNER JOIN @RelevantIncreases ri ON ri.StationNo = s.StationNo
END
根据Microsoft准则,超过五张表不允许加入SQL Server。这是对的吗?如果不正确,按照您的观点,允许在SQL Server中允许加入多少表以获得更好的性能。 – RGS