1

我有这个表结构:

CREATE TABLE JoiningDate 
(
    Id INT,
    DateofJoining DATETIME,
    STATUS VARCHAR(10),
    DaysCount INT
)

该表填充了 1000 条 DaysCount 为 NULL 值的记录。

我为该表创建了如下触发器来更新DaysCount。每当更新DateOfJoiningStatus列时,DaysCount应在触发器中计算并自动更新。

这是触发器的轮廓:

CREATE TRIGGER [dbo].[trigger_JoiningDate] 
ON [dbo].[JoiningDate]
AFTER INSERT, UPDATE
AS
BEGIN
    DECLARE @Id INT
    DECLARE @DateJoining DATETIME
    DECLARE @Result INT

    SELECT @Id = Id,
           @DateJoining = DateofJoining, 
    FROM INSERTED   

    SET @Result = [Formula To Calculate Days]

    UPDATE JoiningDate 
    SET DaysCount = @Result  
    WHERE Id = @Id
END

我能够看到单个记录的计数得到更新。但是对于批量更新,它只更新第一条记录。

在 stackoverflow 的帮助下,我尝试使用而不是触发器、TRIGGER_NESTLEVEL() 等选项,但其他所有行仍然没有得到更新。

更快的帮助表示赞赏。

4

2 回答 2

1

我建议将其拆分为两个单独的触发器 - 一个 for INSERT,一个 for UPDATE。使使用代码变得更加简单。

另外:您的触发器将在每个语句中调用一次-而不是每行一次 - 因此您不能Inserted像这样从伪表中选择一个值(因为该伪表将包含所有25 个新插入的行 - 而不仅仅是一个):

SELECT 
    @Id = Id,
    @DateJoining = DateofJoining, 
FROM INSERTED   

您会查看插入的 25 行中的哪一行?这是任意的和不确定的——而且你只会看一行而忽略所有其他 24 行.....

所以INSERT触发器应该是这样的:

CREATE TRIGGER [dbo].[trigger_JoiningDate_Insert] 
ON [dbo].[JoiningDate]
AFTER INSERT
AS
BEGIN
    UPDATE jd
    SET DaysCount = [Formula To Calculate Days]
    FROM JoiningDate jd
    INNER JOIN Inserted i ON i.Id = jd.Id
END

由于您没有以前的值,因此无需检查这两列之一是否已更新。

您的UPDATE触发器应如下所示:

CREATE TRIGGER [dbo].[trigger_JoiningDate_Update] 
ON [dbo].[JoiningDate]
AFTER UPDATE
AS
BEGIN
    UPDATE jd
    SET DaysCount = DATEDIFF(DAY, jd.DateofJoining, SYSDATETIME())
    FROM JoiningDate jd
    INNER JOIN Inserted i ON i.Id = jd.Id
    INNER JOIN Deleted d ON d.Id = i.Id
    -- check whether "DateOfJoining" or "Status" have been updated
    WHERE
        i.DateOfJoining <> d.DateOfJoining 
        OR i.Status <> d.Status 
END
于 2016-06-28T06:58:16.920 回答
0

只有一条记录得到更新,因为即使在批量记录的情况下您也只更新一条记录。

此外,您应该告诉您的确切公式是什么样的。

您应该将代码更改为:

DECLARE @Id INT
  DECLARE @DateJoining DATETIME
  DECLARE @Result INT

    Declare @Flg int=0
    --if exists(select top 1 id from inserted)
    --set @Flg=1
    --if exists(select top 1 id from deleted)
    --set @Flg=@Flg+2
    if (COLUMNS_UPDATED(DateJoining) or COLUMNS_UPDATED([status]))
    begin

  SET @Result = [Formula To Calculate Days]
  --what is the actual formula ?
  UPDATE jd SET DaysCount = @Result  
        FROM INSERTED i
        inner join JoiningDate jd on i.id=jd.id  
end
于 2016-06-28T04:40:34.030 回答