由于太难解释的原因,我在表中有三列包含日期和时间值。一列仅保存日期,第二列仅保存时间,第三列保存值DATETIME
。看起来像这样:当从NULL更新值时,SQL Server AFTER UPDATE触发器不工作
OPPORTUNITYID | ... | ProductionDate | ProductionTime | PRODUCTIONDATETIME
-------------------------------------------------------------------------------
091798-324971 | ... | 12-07-2014 | 11:30 AM | 2014-07-12 11:30:00:000
然后我有一个触发器,保持这些值同步,无论哪个正在更新。 这是触发(部分):
CREATE TRIGGER [dbo].[TBL_OPPORTUNITY_DUEDATES_TRU]
ON [dbo].[TBL_OPPORTUNITY]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF UPDATE (PRODUCTIONDATETIME)
BEGIN
UPDATE TBL_OPPORTUNITY
SET ProductionDate = CONVERT(VARCHAR(10), PRODUCTIONDATETIME, 105)
, ProductionTime = REPLACE(REPLACE(RIGHT('0'+LTRIM(RIGHT(CONVERT(VARCHAR, PRODUCTIONDATETIME,100), 7)), 7), 'AM', ' AM'), 'PM', ' PM')
WHERE OPPORTUNITYID IN (SELECT i.OPPORTUNITYID FROM inserted i
INNER JOIN deleted d ON i.OPPORTUNITYID = d.OPPORTUNITYID
WHERE NOT i.PRODUCTIONDATETIME = d.PRODUCTIONDATETIME
AND NOT (i.PRODUCTIONDATETIME = '' OR i.PRODUCTIONDATETIME IS NULL)
);
END
IF (UPDATE (ProductionDate) OR UPDATE (ProductionTime))
BEGIN
UPDATE TBL_OPPORTUNITY
SET PRODUCTIONDATETIME = CONVERT(DATETIME, ProductionDate + ' ' + ProductionTime, 105)
WHERE OPPORTUNITYID IN (SELECT i.OPPORTUNITYID FROM inserted i
INNER JOIN deleted d ON i.OPPORTUNITYID = d.OPPORTUNITYID
WHERE (NOT i.ProductionDate = d.ProductionDate
OR NOT i.ProductionTime = d.ProductionTime)
AND NOT (i.ProductionDate = '' OR i.ProductionDate IS NULL)
AND NOT (i.ProductionTime = '' OR i.ProductionTime IS NULL)
);
UPDATE TBL_OPPORTUNITY
SET PRODUCTIONDATETIME = CONVERT(DATETIME, ProductionDate + ' 12:00:00', 105)
WHERE OPPORTUNITYID IN (SELECT i.OPPORTUNITYID FROM inserted i
INNER JOIN deleted d ON i.OPPORTUNITYID = d.OPPORTUNITYID
WHERE (NOT i.ProductionDate = d.ProductionDate
OR NOT i.ProductionTime = d.ProductionTime)
AND NOT (i.ProductionDate = '' OR i.ProductionDate IS NULL)
AND (i.ProductionTime = '' OR i.ProductionTime IS NULL)
);
END
END
GO
触发按预期工作时的任何值被更新。但是,如果值正在从NULL
更新,或者换句话说,列中的旧值为NULL
,并且新值为(例如'02 -03 -12'),则触发器将失败(因为不会进行任何更改) 2014' 。
这是为什么?
服务器是Microsoft SQL Server 2008 R2。
谢谢你的任何线索。
如果更新将所有3列更改为不一致的值,您打算如何处理?哪些值是“正确的”? –
这绝不会发生,因为值是从不同的来源改变的 - 一个来源只改变“组分”值,另一个来源只改变“合成”值。 –