2015-04-29 100 views
2

我使用SQL Server 2012的差异在创建视图上的SQL Server触发器

视图定义是:

create view dbo.emp 
as 
    select 
     e.eid, e.enm, p.fnm, p.lnm 
    from 
     employee e 
    inner join 
     person p on e.eid = p.id 
go 

第一个触发器的定义是:

CREATE trigger emptrgg on emp 
instead of insert 
as 
begin 
    insert into person(id, fnm, lnm) 
     select 
      id, fnm, lnm 
     from inserted 

    insert into employee(eid, enm) 
     select 
      eid, enm 
     from inserted 
end 

触发#2(与触发#1相同,但是通过参数插入值)

CREATE TRIGGER emptrgg 
ON emp 
INSTEAD OF INSERT 
AS 
BEGIN 
    DECLARE @ID INT, @FName NVARCHAR(25), @LName NVARCHAR(25), @PID INT, 
@EmNum NVARCHAR(15) 

    SELECT @ID = eid, @FName =fnm, @LName = lnm 
    FROM inserted 

    INSERT INTO Person(Id, fnm, lnm) 
    VALUES(@ID, @FName, @LName) 

    INSERT INTO Employee(eid, enm) 
    VALUES(@PID, @ENum) 
end 

以上哪一项效率高或性能好?

我不能找到,你能帮我吗?

关于, Chio。

+0

如果向视图中插入多条单条记录,触发器2将无法正常工作。看着风格,我会说你从很多来源copypasted;) – Arvo

回答

3

你触发#2具有的主要缺陷,你认为它会被称为行一次 - 那是的情况。

的触发条件会每条语句一次,因此,如果您INSERT语句影响25行,你会得到触发器触发了一次,但随后Inserted伪表将包含25行。

这25行中的哪一行代码会在这里选择?

SELECT @ID = eid, @FName = fnm, @LName = lnm 
FROM inserted 

它是非确定性的 - 你会得到一个任意的行并忽略所有其他24个。

只使用触发器#1 它使用适当的基于集合的方法来一次处理多个插入的行。而且由于它是基于设置的,所以它对性能来说也是非常理想的。

+0

谢谢! marc_s。 – Chio