在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
以外的任何列的某些内容发生了变化,我该如何插入?
由于
答案 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
子句中,则该列将被称为“已更新” - 即使该值未发生更改。