如果任何列已更改,则插入,除非只有一个特定列

时间:2016-07-01 13:36:40

标签: sql tsql triggers sql-server-2012 insert

在TSQL中,是否可以检测列中的值是否已更改?如果任何列已更改但我想从触发器插入一行但是如果特定列(created_at)是唯一更改的,则不要插入任何内容。

我有这个,但每次都会插入,即使它没有任何改变

BEGIN
INSERT INTO dbo.Changes (
            [name] 
            --... other columns
            [created_at]
       )
SELECT 
            ins.[name],
            ins.[created_at]                
FROM INSERTED ins 
WHERE
      [name] != ins.[name] OR 
      [age] != ins.[age]

如果除created_at以外的任何列的某些内容发生了变化,我该如何插入?

由于

1 个答案:

答案 0 :(得分:1)

假设您的表有主键,您可以执行以下操作:

SELECT ins.[name], ins.[created_at]                
FROM INSERTED ins JOIN
     DELETED del
     ON ins.id = del.id
WHERE del.[name] <> ins.[name] OR 
      del.[age] <> ins.[age];

请注意,您的逻辑无法正确处理NULL值。

使用DELETED,您也可以在没有UPDATE()的情况下执行类似的逻辑。但是,这是一个奇怪的函数,因为它在inserted中的整个集合上运行,而不是逐行运行。因此,如果列在SET子句中,则该列将被称为“已更新” - 即使该值未发生更改。