带有用于多行插入的循环的 SQL Server 触发器

标签 sql sql-server tsql database-trigger

我已经为我的数据库创建了触发器来处理一些插入,但是当我在 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/

相关文章:

sql - 基于 SQL Server 中多个先前行的值提取行

sql - 根据最大值连接表

java - 使用注释的 native hibernate/jpa 查询中标量值的问题

远程连接到 SQL Server 2005 实例时出现 C# 异常

sql-server - 将父表列值附加到sql中的子表列

sql-server - 动态创建临时表,插入临时表,然后选择

sql - Postgres 不接受列名前的表别名

sql - SQL Server 2008 中的循环插入语句

SQL SELECT 多列合并为 1

c# - 在 SqlCommand 中传递数组参数