簡體   English   中英

SQL Server:如果不存在則觸發更新

[英]SQL Server : trigger update if not exists

我有以下觸發因素使我感到悲傷。

ALTER TRIGGER [dbo].[T_DMS_Factory_I]
   ON  [dbo].[jobrun]
   AFTER INSERT
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for trigger here
    IF NOT EXISTS (select * from inserted i
                   inner join [db2].[dbo].[table2] t2 on t2.JobRunID = i.jobrun_id)
       UPDATE [db2].[dbo].[table2]
       SET ProdDt = i.jobrun_proddt,
           CreateDt = GETDATE(),
           JobrunID = i.jobrun_id,
           Start = i.jobrun_time,
           End = i.jobrun_stachgtm,
           Status = i.jobrun_status,
           ActiveDuration = i.jobrun_duration,
           TotalDuration = i.jobrun_duration
       FROM inserted i
       INNER JOIN jobmst jm ON jm.jobmst_id = i.jobmst_id
       WHERE jm.jobmst_alias = 'blah'
END

上面的工作正常,但它使用我不需要的相同數據更新所有行。 我只希望它更新從另一列稱為baseEnd的插入時間之前的時間所在的baseEnd

WHERE jm.jobmst_alias = 'blah' AND baseEnd <= i.jobrun_time AND JobRunID IS NOT NULL

我以為那是應該的,但事實並非如此。 我究竟做錯了什么?

查看代碼中的表

UPDATE [db2].[dbo].[table2]
SET 
....
FROM inserted i
inner join jobmst jm on jm.jobmst_id = i.jobmst_id
where jm.jobmst_alias = 'blah'

如果要更新匹配的記錄,則FROM子句中不應該包含table2。

否則,您只是從插入表和Jobmst表中取回一些記錄,並將其中之一的值激發到table2中的所有記錄中

這就是為什么它不起作用

很難完全了解您要實現的邏輯,但這可能正是您所需要的

UPDATE t2
SET ProdDt = i.jobrun_proddt,
CreateDt = GETDATE(),
JobrunID = i.jobrun_id,
Start = i.jobrun_time,
End = i.jobrun_stachgtm,
Status = i.jobrun_status,
ActiveDuration = i.jobrun_duration,
TotalDuration = i.jobrun_duration
FROM inserted i
inner join jobmst jm on jm.jobmst_id = i.jobmst_id
inner join [db2].[dbo].[table2] t2 ON  t2.baseEnd <= i.jobrun_time 
where jm.jobmst_alias = 'blah'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM