用当前日期替换空值的插入触发器后的SQL Server 2012
如果用当前日期替换空值的插入触发器后的SQL Server 2012,sql,sql-server,triggers,sql-insert,Sql,Sql Server,Triggers,Sql Insert,如果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
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
感谢您的帮助
非常感谢 你的方法不正确。您应该只使用DateAdded
的默认值。但是,此查询的问题是:
UPDATE Products
SET DateAdded = GETDATE()
WHERE DateAdded IS NULL
AND DateAdded IN (SELECT DateAdded FROM inserted);
这两个条件是不相容的。您的DataAdded为空
fine。这是真的。但是几乎所有与NULL
的比较都是错误的,包括比较中的。因此,对于您想要做的事情,这应该足够了:
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);
我注意到触发器正在更新被修改的同一个表,这通常会导致代码混乱。为什么要使用触发器?只需给列一个默认值getdate()
@GordonLinoff它是我分配的一部分,触发器用于更新将来可能插入的任何记录,而不指定日期,这样它将包括当前日期。谢谢@Gordon!我想我把问题复杂化了。谢谢!