【问题标题】:Insert if any column has changed except if only one particular one has如果任何列已更改,则插入,除非只有一个特定的列已更改
【发布时间】:2016-11-03 22:52:22
【问题描述】:

在 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 之外的任何列发生了更改,我如何才能插入?

谢谢

【问题讨论】:

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


    【解决方案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 值。

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

    【讨论】:

    • 完美,谢谢!只是一个小改动,我不得不使用ins.IDENTITYCOLdel.IDENTITYCOL
    猜你喜欢
    • 1970-01-01
    • 2017-01-27
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    相关资源
    最近更新 更多