【问题标题】:SQL Server 2012 AFTER INSERT trigger that replaces null value with current dateSQL Server 2012 AFTER INSERT 触发器,用当前日期替换空值
【发布时间】:2014-05-12 04:22:23
【问题描述】:

如果Products 表的DateAdded 列的值为null,我需要创建一个触发器来插入该列的当前日期。

这是我尝试过的:

Use MyGuitarShop;
IF OBJECT_ID ('Products_INSERT') IS NOT NULL
    DROP TRIGGER Products_INSERT;
GO

CREATE TRIGGER Products_INSERT
    ON Products
    AFTER INSERT
AS
    UPDATE Products
    SET DateAdded = GETDATE()
    WHERE DateAdded IS NULL
        AND DateAdded IN (SELECT DateAdded FROM inserted);
GO

为了测试这一点,我运行了以下 INSERT 语句:

INSERT INTO Products
VALUES (4, 'AK-5300', 'Awesome Keyboard 5300',
        'This keyboard is so awesome, you just might freak!',
        699.99, 30.00, NULL)

运行INSERT 语句后,DateAdded 列仍然显示NULL

感谢任何帮助。

非常感谢!

【问题讨论】:

  • 为什么要为此使用触发器?只需为该列指定默认值getdate()
  • @GordonLinoff 这是我的任务的一部分,触发器的目的是更新将来可能插入的任何没有指定日期的记录,这样它就会包括当前日期。

标签: sql sql-server triggers sql-insert


【解决方案1】:

您的方法不是正确的方法。您应该只使用DateAdded 的默认值。但是,这个查询的问题:

UPDATE Products
SET DateAdded = GETDATE()
WHERE DateAdded IS NULL
    AND DateAdded IN (SELECT DateAdded FROM inserted);

就是这两个条件不兼容。你有DataAdded IS NULL 很好。那是真实的。但几乎所有与NULL 的比较都是错误的,包括IN 比较。因此,对于您想要做的事情,这应该就足够了:

UPDATE Products
SET DateAdded = GETDATE()
WHERE DateAdded IS NULL;

你可以写:

UPDATE Products
SET DateAdded = GETDATE()
WHERE DateAdded IS NULL OR
      DateAdded IN (SELECT DateAdded FROM inserted);

我确实注意到触发器正在更新被修改的同一个表,这通常会导致代码混乱。

【讨论】:

  • 谢谢@Gordon!我想我把问题复杂化了。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 2013-03-29
相关资源
最近更新 更多