설명하기에는 너무 어리석은 이유로 날짜 및 시간 값을 보유하는 테이블에 세 개의 열이 있습니다. 한 열에는 날짜 만, 두 번째 열에는 시간 만, 세 번째 열에는 DATETIME
값이 있습니다. 다음과 같이 보입니다.
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-2014 '인 경우 .
왜 그런 겁니까?
서버는 Microsoft SQL Server 2008 R2입니다.
단서를 주셔서 감사합니다.
작성시 트리거는 NULL을 포함하는 같음 또는 같지 않음이 참으로 평가 될 수 없기 때문에 이전 값이 NULL 인 행을 무시해야합니다. 와 같은 WHERE 조건 NOT i.ProductionDate = d.ProductionDate
은 i.ProductionDate가 무엇이든 상관없이 d.ProductionDate가 NULL이면 어떤 행도 반환하지 않습니다. d.ProductionDate IS NULL
d.ProductionDate에 값이없는 경우를 처리 할 가능성을 명시 적으로 확인해야 합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다