我已经为我的数据库创建了触发器来处理一些插入,但是当我在 1 个 SQL 查询中添加多个值时它不起作用:
ALTER TRIGGER [dbo].[ConferenceDayTrigger]
ON [dbo].[Conferences]
AFTER INSERT
AS
BEGIN
DECLARE @ID INT
DECLARE @dayC INT
DECLARE @counter INT
SET @counter = 1
SET @ID = (SELECT IDConference FROM Inserted)
SET @dayC = (SELECT DATEDIFF(DAY, start,finish) FROM Inserted)
WHILE @counter <= @dayC + 1
BEGIN
EXEC AddConferenceDay @Id, @counter
SET @counter = @counter +1
END
END
对于单次插入,它工作正常。但是我应该更改/添加什么以使其对每一行插入的值执行?
最佳答案
如果您无法更改存储过程,那么这可能是(极少数)使用游标的情况之一。双循环,实际上:
ALTER TRIGGER [dbo].[ConferenceDayTrigger]
ON [dbo].[Conferences]
AFTER INSERT
AS
BEGIN
DECLARE @ID INT;
DECLARE @dayC INT;
DECLARE @counter INT
SET @counter = 1;
DECLARE yucky_Cursor CURSOR FOR
SELECT IDConference, DATEDIFF(DAY, start,finish) FROM Inserted;
OPEN yucky_Cursor; /*Open cursor for reading*/
FETCH NEXT FROM yucky_Cursor INTO @ID, @dayC;
WHILE @@FETCH_STATUS = 0
BEGIN
WHILE @counter <= @dayC + 1
BEGIN
EXEC AddConferenceDay @Id, @counter;
SET @counter = @counter + 1;
END;
FETCH NEXT FROM yucky_Cursor INTO @ID, @dayC;
END;
CLOSE yucky_Cursor;
DEALLOCATE yucky_Cursor;
END;
我怀疑有一种方法可以重构和摆脱游标并使用基于集合的操作。
关于带有用于多行插入的循环的 SQL Server 触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41947998/