代码之家  ›  专栏  ›  技术社区  ›  Bill Greer

SQL Server:批量更新时触发

  •  0
  • Bill Greer  · 技术社区  · 7 年前

    如何将下面的触发器更改为批量更新?在扳机里,我收到了 ActivityTypeID . 如果值是'32E490BB-DA7E-E811-80D9-00155D012204',则我确保 IsBillable 列设置为0,否则我将列设置为1。

    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TRIGGER [dbo].[trg_WorklogInsert1]
    ON  [dbo].[WorkLog]
    AFTER INSERT, UPDATE
    AS 
    BEGIN
        SET NOCOUNT ON;
    
        DECLARE @ActivityTypeID UNIQUEIDENTIFIER;
    
        SET @ActivityTypeID = (SELECT [ActivityType_Id] FROM inserted);
    
        IF @ActivityTypeID = '32E490BB-DA7E-E811-80D9-00155D012204'
        BEGIN
            UPDATE w
            SET w.IsBillable = 0
            FROM [dbo].[WorkLog] AS w
            INNER JOIN inserted AS i ON w.Id = i.Id
        END
        ELSE
        BEGIN
            UPDATE w
            SET w.IsBillable = 1
            FROM [dbo].[WorkLog] AS w
            INNER JOIN inserted AS i ON w.Id = i.Id
        END
    END
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Ronen Ariely    7 年前

    很好的一天,

    请检查下面的触发器是否能满足您的需要:

    CREATE TRIGGER [dbo].[trg_WorklogInsert1] ON  [dbo].[WorkLog] AFTER INSERT,UPDATE AS BEGIN
        SET NOCOUNT ON;
        UPDATE w
            set w.IsBillable = 
            CASE 
                WHEN i.ActivityType_Id = '32E490BB-DA7E-E811-80D9-00155D012204'
                    THEN 0
                ELSE 1
            END
        FROM [dbo].[WorkLog] as w
        INNER JOIN inserted as i on w.Id = i.Id
    END
    GO
    

    注意! 据我所知,您的问题与大容量插入无关,而是与插入在一起的多行有关(您的触发器版本仅涵盖插入/更新单行的情况)。如果不是这样,请详细说明。