更新后TSQL触发检查一次IF更新中的多列上的更新

更新后TSQL触发检查一次IF更新中的多列上的更新,sql,sql-server,tsql,triggers,sql-update,Sql,Sql Server,Tsql,Triggers,Sql Update,TSQL中更新后触发器的基本语法为: CREATE TRIGGER [dbo].[triggerName] ON [dbo].[Table] AFTER UPDATE, INSERT --trigger when Update or Insert in table AS BEGIN SET NOCOUNT ON; IF UPDATE (ColumnA) -- if ColumnA updates start begin UPDATE Table

TSQL中更新后触发器的基本语法为:

CREATE TRIGGER [dbo].[triggerName]
   ON [dbo].[Table]
   AFTER UPDATE, INSERT --trigger when Update or Insert in table
AS BEGIN
    SET NOCOUNT ON;
    IF UPDATE (ColumnA) -- if ColumnA updates start
    begin
        UPDATE Table
        SET ColumnC = ColumnA + ColumnB -- recalculate Column C
    end 
    IF UPDATE (ColumnB) -- if ColumnB updates start
    begin
        UPDATE Table
        SET ColumnC = ColumnA + ColumnB -- recalculate Column C
    end 
END
现在,我想上面的方法可能会奏效,但如果将两个更新合并为一个,是否有可能呢 大概是这样的:

IF UPDATE (ColumnA) OR (ColumnB) -- if ColumnA or ColumnB updates start
        begin
            UPDATE Table
            SET ColumnC = ColumnA + ColumnB -- recalculate Column C
        end 
当然可以使用计算列,但出于好奇,我想知道是否可以在触发器中一次检查多个列上的更新,然后执行更新后的触发器修改

您可以使用:

返回表示表或视图中插入或更新的列的
varbinary
位模式

只需检查您感兴趣的任何位是否使用逐位运算符进行设置:

IF (COLUMNS_UPDATED() & CAST(0x0A as int)) != 0
begin
   --column 2 or 4 was updated
end

当然,这取决于列顺序,这通常是一件不好的事情,如果以后更改列顺序,它也不会爆炸。

这对于注释来说有点长

UPDATE()
是触发器中使用的函数。如果UPDATE(),则没有特定的语法。据我所知,触发器允许您在
if
语句中组合多个条件

但是,更重要的是,请阅读
UPDATE()
上的。文档中使用的示例如下:

IF ( UPDATE (StateProvinceID) OR UPDATE (PostalCode) )
BEGIN
    RAISERROR (50009, 16, 10)
END;
因此,使用正确的语法即可:

IF UPDATE(ColumnA) OR UPDATE(ColumnB) -- if ColumnA or ColumnB updates start
    begin
        UPDATE Table
        SET ColumnC = ColumnA + ColumnB -- recalculate Column C
    end 

但是,我建议您改用计算列。

另外,现在,您要为表中的所有行重新计算
列C
,而不仅仅是受插入或更新操作影响的行。……是的,计算列肯定是最好的选择。你的例子也回答了我关于触发器的问题,谢谢!