SQL 触发器被调用不止一次

SQL Trigger getting invoked more than once

我有一个 INSERT TRIGGER 如下:

ALTER TRIGGER [dbo].[TrackingInitialize]
   ON  [dbo].[WorkSchedule_] 
   AFTER INSERT
AS
    DECLARE @work_area varchar(255);
    DECLARE @schedule_date date;
    DECLARE @employee1 varchar(255);
    DECLARE @hours1 float;

BEGIN

    SET NOCOUNT ON;

    SELECT @work_area=i.WorkArea FROM inserted i;
    SELECT @schedule_date=i.ScheduleDate FROM inserted i;
    SELECT @employee1=i.Employee1 FROM inserted i;
    SELECT @hours1=i.Hours1 FROM inserted i;

    SELECT @ccname = CostCenter_.Name
    FROM WorkArea_, CostCenter_
    WHERE WorkArea_.CostCenterID = CostCenter_.ID and WorkArea_.WorkAreaName = @work_area

    IF (@employee1 is not NULL)
    BEGIN   
        INSERT into dbo.TrackingInfo_ VALUES(@schedule_date, @employee1, @work_area,null,null,null,null,null, null, null,@ccname,null, @hours1, 0.0, @hours1,0.0);
    END
END

我正在使用 cmd.ExecuteScalar()INSERT 来自我的 asp.net 应用程序的新值。但是在每次插入之后,我的触发器都会插入额外的 7 行数据,员工为空。查询执行不存在于任何循环中。怎么可能?

我不确定你的触发器有什么问题,但它没有正确编程。您假设 inserted 仅包含一行,这是不正确的。

也许您希望触发器执行此操作:

    INSERT into dbo.TrackingInfo_
        SELECT employee, work_area, null, null, null ,null, null, null, null,
               cc.name, null, hours, 0.0, hours1, 0.0
        FROM inserted i JOIN
             WorkArea_ w 
             ON w.workareaname = i.work_area JOIN
             CostCenter_ cc
             ON w.CostCenterID = cc.ID 
        WHERE employee IS NOT NULL;

我强烈建议您也在 insert 中明确列出列。

问题是触发器的 if 语句失败,因为员工值被分配为空而不是 null。于是将TRIGGER代码改成如下:

 IF (@employee1 is not NULL AND datalength(@employee1) != 0)
    BEGIN   
        INSERT into dbo.TrackingInfo_ SELECT employee, work_area, null, null, null ,null, null, null, null,
           cc.name, null, hours, 0.0, hours1, 0.0
    FROM inserted i JOIN
         WorkArea_ w 
         ON w.workareaname = i.work_area JOIN
         CostCenter_ cc
         ON w.CostCenterID = cc.ID 
    WHERE employee IS NOT NULL;
    END

现在一切正常。谢谢大家:)