Fil*_*lip 1 sql t-sql sql-server triggers
我想在 SQL Server 中找到一种方法,如何更新某些特定属性已更改的行。简单的例子,我想Flag = True在所有行中设置,其中KeyProperty已更改。我创建了 SQL 触发器:
CREATE TRIGGER testTrigger
ON table
AFTER UPDATE
AS
BEGIN
IF(UPDATE(KeyProperty))
BEGIN
UPDATE table
SET Flag = True
WHERE EXISTS (SELECT 1 FROM inserted WHERE inserted.Id = table.Id)
END
END
GO
Run Code Online (Sandbox Code Playgroud)
但从我假设的结果UPDATE(KeyProperty)来看,如果至少有一行,则KeyProperty更新在哪里。所以如果我有初始表:
| ID | 关键属性 | 其他财产 | 旗帜 |
|---|---|---|---|
| 1 | 100 | 红色的 | 错误的 |
| 2 | 200 | 蓝色的 | 错误的 |
| 3 | 300 | 黑色的 | 错误的 |
更新看起来像:
| ID | 关键属性 | 其他财产 | 旗帜 |
|---|---|---|---|
| 1 | 1000 | 红色的 | 真的 |
| 2 | 200 | 蓝色的 | 错误的 |
| 3 | 300 | 白色的 | 真的 |
因此,即使第三行中的标志也被更新,因为有另一个更新并且该行出现在inserted逻辑表中。
有没有办法将inserted表中的行与UPDATE()该特定行的条件相匹配?将条件放在 WHERE 语句中会得到相同的结果。
您需要比较inserted和deleted表,通过主键连接,并验证结果是否不同。
请注意,该UPDATE()函数仅告诉您该列是否存在于 中UPDATE,而不是告诉您值是否实际更改。
CREATE TRIGGER testTrigger
ON table
AFTER UPDATE
AS
SET NOCOUNT ON;
IF(UPDATE(KeyProperty))
BEGIN
UPDATE t
SET Flag = True
FROM (
SELECT i.Id, i.KeyProperty
FROM inserted i
EXCEPT
SELECT d.Id, d.KeyProperty
FROM deleted d
) i
JOIN table t ON t.Id = i.Id
END
GO
Run Code Online (Sandbox Code Playgroud)