SQL Server 2008-帮助编写简单插入触发器
这是与Microsoft SQL Server 2008一起使用的 我有两个表,Employee和EmployeeResult,我正试图在EmployeeResult上编写一个简单的插入触发器来实现这一点-每次插入EmployeeResult时,例如: (杰克,200岁,销售) (简,300岁,市场营销) (约翰,400岁,工程学) 它应该查找名称、部门条目对,例如 (杰克,销售部), (简,市场营销), (约翰,工程) 在Employee表中,如果该员工不存在,则应将其插入Employee表中 我所知道的是关于如何修复“?”s的未知问题: 请帮忙,提前谢谢 模式:SQL Server 2008-帮助编写简单插入触发器,sql,sql-server-2008,insert,triggers,Sql,Sql Server 2008,Insert,Triggers,这是与Microsoft SQL Server 2008一起使用的 我有两个表,Employee和EmployeeResult,我正试图在EmployeeResult上编写一个简单的插入触发器来实现这一点-每次插入EmployeeResult时,例如: (杰克,200岁,销售) (简,300岁,市场营销) (约翰,400岁,工程学) 它应该查找名称、部门条目对,例如 (杰克,销售部), (简,市场营销), (约翰,工程) 在Employee表中,如果该员工不存在,则应将其插入Employee表中
Employee
--------
Name, varchar(50)
Department, varchar (50)
EmployeeResult
--------------
Name, varchar(50)
Salary, int
Department, varchar (50)
您希望利用触发器上下文中可用的插入的逻辑表。它与正在插入的表的架构匹配,并包括将插入的行(在更新触发器中,您可以访问分别表示新数据和原始数据的插入的和删除的逻辑表。) 因此,要插入当前不存在的员工/部门对,您可以尝试以下操作
CREATE TRIGGER trig_Update_Employee
ON [EmployeeResult]
FOR INSERT
AS
Begin
Insert into Employee (Name, Department)
Select Distinct i.Name, i.Department
from Inserted i
Left Join Employee e
on i.Name = e.Name and i.Department = e.Department
where e.Name is null
End
cmsjr找到了正确的解决方案。我只是想为你的未来发展指出几点。如果您在触发器的insert中使用values语句,则很有可能您做了错误的事情。为插入、删除或更新的每批记录触发一次。因此,如果在一批中插入十条记录,那么触发器将触发一次。如果您引用的是inserted或deleted中的数据,并使用variables和values子句,那么您只需要获取其中一条记录的数据。这会导致数据完整性问题。您可以通过使用基于集合的插入(如上面cmsjr所示)或使用光标来修复此问题。永远不要选择光标路径。触发器中的光标是一个等待发生的问题,因为它们很慢,很可能会将您的表锁定数小时。我从触发器中删除了一次光标,并将导入过程从40分钟改进为45秒 您可能认为没有人会添加多个记录,但这种情况比大多数非数据库用户意识到的更频繁。不要编写在所有可能的插入、更新和删除条件下都无法工作的触发器。当他们必须从新客户导入1000000条销售目标记录,或更新10%的所有价格,或删除您不再销售其产品的供应商的所有记录时,没有人会使用一次一条记录的方法 检查此代码:
CREATE TRIGGER trig_Update_Employee ON [EmployeeResult] FOR INSERT AS Begin
Insert into Employee (Name, Department)
Select Distinct i.Name, i.Department
from Inserted i
Left Join Employee e on i.Name = e.Name and i.Department = e.Department
where e.Name is null
End
CREATE TRIGGER trig_Update_Employee ON [EmployeeResult] FOR INSERT AS Begin
Insert into Employee (Name, Department)
Select Distinct i.Name, i.Department
from Inserted i
Left Join Employee e on i.Name = e.Name and i.Department = e.Department
where e.Name is null
End