我需要创建一个更新触发器,它仅在我的记录状态与上次记录的状态不同时才有效。
所以我现在有这个:
for UPDATE
AS
begin try
INSERT INTO tblHistorySource(*)
select *
from [DELETED]
end try
但我需要检查 tblHistorySource.status 是否不等于 delete.status 然后才复制数据....
我需要创建一个更新触发器,它仅在我的记录状态与上次记录的状态不同时才有效。
所以我现在有这个:
for UPDATE
AS
begin try
INSERT INTO tblHistorySource(*)
select *
from [DELETED]
end try
但我需要检查 tblHistorySource.status 是否不等于 delete.status 然后才复制数据....
您需要小心处理一组数据,而不是一次只处理一条记录:
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()
包装器进行简化,但我需要知道数据类型。
只需添加:
IF ((SELECT Status FROM Delted) <> SELECT Status FROM Inserted))
BEGIN
...
END
你可以这样做:
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 语句并将它们放入迭代中以处理所有寄存器。