为什么检查UPDATE(<column>)返回false?

时间:2018-10-08 09:55:29

标签: sql sql-server triggers

我已经在SQL Server中创建了一个触发器:

ALTER trigger [dbo].[TIME_PersonalTagUpdIns] on [dbo].[TIME_PersonalTag] for INSERT,UPDATE as
    if not UPDATE(SyncToTimeTac)
    BEGIN
       update a
          set a.SyncToTimeTac=0x31
          from TIME_PersonalTag a inner join inserted b on a.Ident=b.Ident 
          where a.Erledigt = 0x31
    END

现在,当我执行

update TIME_PersonalTag set SyncToTimeTac = 0x30

目标是不执行触发器中的逻辑。为此,我在开头if not UPDATE(SyncToTimeTac)处进行检查-但是,当我运行上述语句时,触发器逻辑仍将执行。

我不明白为什么会这样。

1 个答案:

答案 0 :(得分:0)

即使您专门更新了SyncToTimeTac,我也不知道为什么触发逻辑会被执行,但是我可以提供UPDATE()函数的替代方法,它更可靠-因为{{ 1}}函数即使更新失败也会返回true:

UPDATE

现在,仅当该列的值未更改时,才应将ALTER trigger [dbo].[TIME_PersonalTagUpdIns] on [dbo].[TIME_PersonalTag] FOR INSERT,UPDATE AS UPDATE a SET a.SyncToTimeTac = 0x31 FROM TIME_PersonalTag AS a INNER JOIN inserted AS i ON a.Ident = i.Ident INNER JOIN deleted AS d ON d.Ident = i.Ident WHERE a.Erledigt = 0x31 AND ISNULL(i.SyncToTimeTac, 0x31) = ISNULL(d.SyncToTimeTac, 0x31) END 设置为SyncToTimeTac