这是与Microsoft SQL Server 2008。
我有2个表,员工和EmployeeResult,我试图写上EmployeeResult一个简单的INSERT触发器这一点,确实 - 一个INSERT完成到EmployeeResult如每次:
(杰克,200,销售部)(简,300,市场营销)(约翰,400工程)
它应该查找的姓名,部门的条目对,如
(杰克,销售),(简,市场营销),(约翰,工程)
Employee表内,如果这样的员工不存在,应该插入到Employee表。
我所拥有的,这是关于如何修复“???” S未知数:
CREATE TRIGGER trig_Update_Employee
ON [EmployeeResult]
FOR INSERT
AS
IF EXISTS (SELECT COUNT(*) FROM Employee WHERE ???)
BEGIN
INSERT INTO [Employee] (Name, Department) VALUES (???, ???)
END
请帮帮忙,在此先感谢
架构:
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有正确的解决方案。 我只是想指出的几件事情对你的未来发展触发器。 如果您使用的是值的语句在触发插入,还有就是你是做了错误的事情杨卫国可能性。 对于插入,删除或更新的记录每批触发火一次。 所以,如果十个记录插入一个批次中,则触发器触发一次。 如果你是指的在插入或删除,并使用变量的数据和值条款,那么你只会得到的数据为这些记录之一。 这将导致数据完整性问题。 如cmsjr示出了以上或通过使用光标可以通过使用基于集合的插入件解决这一问题。 永远不要选择光标路径。 在触发游标是等待,因为他们是缓慢的,并可能锁定你的表好几个小时发生的问题。 我从触发除去光标一次的和改进的40分钟导入过程为45秒。
你可能会认为没有人曾经打算增加多条记录,但它发生的频率比大多数非数据库的人认识。 不要写一个触发器,它不会在所有可能的工作,插入,更新,删除的条件。 没有人会使用一条记录时间的方法时,他们不得不从一个新客户导入百万销量目标的记录或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