因此,我创建了一个触发器,用于比较更新前后的情况,并确定 where 子句中指定的特定字段是否已更改。如果是这样,我会将先前信息的快照插入历史表中。
问题在于,当字段使用空值创建时(根据业务规则,它是合法的空),并且进行更新时,无法评估字符串是否不等于空值。我想捕捉到它发送给我们的时候是空的,后来又填了。
我应该使用什么方法来比较空字段而不影响性能?
这是针对 SQL Server 2005 的
CREATE TRIGGER [prj].[TRG_Master_Projection_Upd_History] ON [prj].[Master_Projections]
AFTER UPDATE
AS
SET NOCOUNT ON -- Prevents the error that gets thrown after inserting multiple records
-- if multiple records are being updated
BEGIN
INSERT INTO prj.History_Projections (ProjectionID, Cancelled, Appeal, Description, Response_PatternID,
Proj_Mail_date, [3602_Mail_Date], Proj_Qty, [3602_Qty], Proj_Resp_Rate,
Bounce_Back, Nickels, Kits, Oversized_RE, ChangeComments,
Modification_Process, Modification_Date, Modification_User)
SELECT D.ProjectionID, D.Cancelled, D.Appeal, D.Description, D.Response_PatternID, D.Proj_Mail_Date,
D.[3602_Mail_Date], D.Proj_Qty, D.[3602_Qty], D.Proj_Resp_Rate, D.Bounce_Back, D.Nickels, D.Kits,
D.Oversized_RE, D.ChangeComments, D.Modification_Process, D.Modification_Date, D.Modification_User
FROM deleted as D
JOIN inserted as I
ON D.ProjectionID = I.ProjectionID
WHERE (I.Cancelled <> D.Cancelled
OR I.Appeal <> D.Appeal
OR I.Description <> D.Description
OR I.Response_PatternID <> D.Response_PatternID
OR I.Proj_Mail_Date <> D.Proj_Mail_Date
OR I.[3602_Mail_Date] <> D.[3602_Mail_Date]
OR I.Proj_Qty <> D.Proj_Qty
OR I.[3602_Qty] <> D.[3602_Qty]
OR I.Proj_Resp_Rate <> D.Proj_Resp_Rate
OR I.Bounce_Back <> D.Bounce_Back
OR I.Nickels <> D.Nickels
OR I.Kits <> D.Kits
OR I.Oversized_RE <> D.Oversized_RE )
END;
SET NOCOUNT OFF;
最佳答案
不幸的是,你确实必须使用哨兵值
ISNULL(I.Response_PatternID, 0) <> ISNULL(D.Response_PatternID, 0)
不幸的是,这并没有什么魔力:您必须比较每个值才能看到任何差异。
也就是说,您只触及 INSERTED 和 DELETED 表,尽管如此糟糕,但主表并未触及。除非您有影响 10000 行的更新,否则它将运行正常。
你也可以使用 OR 来实现,但这很麻烦
(I.Response_PatternID <> D.Response_PatternID OR I.Response_PatternID IS NULL AND I.Response_PatternID IS NOT NULL OR I.Response_PatternID IS NOT NULL AND I.Response_PatternID IS NULL)
我会坚持使用 ISNULL 以避免 COALESCE 出现微妙的数据类型问题
关于sql-server - 比较触发器中的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3999582/