我需要创建一个更新触发器,只有当我的记录状态与记录的最后一个状态不同时才会起作用。
所以我现在就拥有这个:
for UPDATE
AS
begin try
INSERT INTO tblHistorySource(*)
select *
from [DELETED]
end try
但我需要shomehow检查是否 tblHistorySource.status不等于delete.status然后才复制数据....
答案 0 :(得分:4)
您需要注意的是,您正在处理设置数据,而不是一次只处理一条记录:
INSERT INTO tblHistorySource
SELECT *
FROM DELETED INNER JOIN
INSERTED ON <<DELETED.PK = INSERTED.PK>>
WHERE DELETED.StatusValue <> INSERTED.StatusValue;
联接条件<<DELETED.PK = INSERTED.PK>>
需要适应您的架构,StatusValue
的真实姓名也是如此。
如果StatusValue
可以为空(感谢Alex),请改用:
WHERE DELETED.StatusValue <> INSERTED.StatusValue
OR DELETED.StatusValue IS NULL AND INSERTED.StatusValue IS NOT NULL
OR DELETED.StatusValue IS NOT NULL AND INSERTED.StatusValue IS NULL;
使用ISNULL()
包装器可能会简化,但我需要知道数据类型。
答案 1 :(得分:1)
只需添加:
IF ((SELECT Status FROM Delted) <> SELECT Status FROM Inserted))
BEGIN
...
END
答案 2 :(得分:-2)
您可以这样做:
DECLARE @statusOldValue status_type
DECLARE @statusNewValue status_type
SELECT @statusOldValue = status FROM deleted
SELECT @statusNewValue= status FROM inserted
IF (@statusOldValue<>@statusNewValue) THEN
BEGIN
-- Do what you want
END
如果您可能遇到同时更新多个寄存器的情况,那么您需要将WHERE子句放入SELECT语句并将它们放入迭代中以便处理所有寄存器。