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
现在一切正常。谢谢大家:)
我有一个 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
现在一切正常。谢谢大家:)