Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server 2008-帮助编写简单插入触发器_Sql_Sql Server 2008_Insert_Triggers - Fatal编程技术网

SQL Server 2008-帮助编写简单插入触发器

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表中

这是与Microsoft SQL Server 2008一起使用的

我有两个表,Employee和EmployeeResult,我正试图在EmployeeResult上编写一个简单的插入触发器来实现这一点-每次插入EmployeeResult时,例如:

(杰克,200岁,销售) (简,300岁,市场营销) (约翰,400岁,工程学)

它应该查找名称、部门条目对,例如

(杰克,销售部), (简,市场营销), (约翰,工程)

在Employee表中,如果该员工不存在,则应将其插入Employee表中

我所知道的是关于如何修复“?”s的未知问题:

请帮忙,提前谢谢

模式:

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