2014-09-19 70 views
0

我有一個插入語句在內部觸發器上執行,但插入語句插入到ItemLookups中的值來自ItemsProduced a,它確實存在,而不是更新a.Casecount並只插入where它不存在。我在哪裏將我的更新和設置命令合併到這個查詢中?任何建議?感謝您的任何幫助。從連接插入並選擇最後一行

USE [**] 
GO 
/****** Object: Trigger [dbo].[spItemLookupNActuals] Script Date: 09/18/2014 14:30:09 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

-- ============================================= 

-- ============================================= 
ALTER TRIGGER [dbo].[spItemLookupNActuals] 
    ON [dbo].[ItemsProduced] 
    AFTER INSERT,DELETE,UPDATE 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 



    INSERT INTO dbo.itemlookup 
      ( 
         itemnumber, 
         cases, 
         [Description], 
         [Type], 
         wic, 
         elc, 
         totalelc, 
         lbspercase, 
         totallbs, 
         peoplerequired, 
         schedulehours, 
         rated, 
         capacity, 
         shift, 
         [DateTime], 
         [TimeStamp] 
      ) 
SELECT TOP 1 
      a.itemnumber, 
      a.casecount, 
      b.itemdescription, 
      b.divisioncode, 
      b.workcenter, 
      b.laborpercase, 
      a.casecount* b.laborpercase* c.ipcg, 
      b.lbspercase, 
      b.lbspercase* a.casecount, 
      b.personsreqd, 
      d.schedhours, 
      b.poundrating, 
      b.poundrating*d.schedhours, 
      a.shift, 
      a.datetime, 
      a.timestamp 
FROM  itemsproduced a 
INNER JOIN masteritemlist b 
ON   a.itemnumber = b.itemnumber 
CROSS apply 
      ( 
        SELECT TOP 1 
           * 
        FROM  itemmultipliers2 c 
        WHERE c.datetime = a.datetime 
        ORDER BY c.timestamp DESC)c 
CROSS apply 
      ( 
        SELECT TOP 1 
           * 
        FROM  itemactuals d 
        WHERE d.datetime =a.datetime 
        AND  d.wc = b.workcenter 
        AND  d.shift= a.shift 
        ORDER BY d.timestamp DESC) d 
WHERE  NOT EXISTS 
      ( 
        SELECT * 
        FROM itemlookup 
        WHERE itemnumber =a.itemnumber 
        AND shift=a.shift 
        AND datetime = a.datetime) 
    end 
+1

可能會將插入/更新/刪除的觸發器拆分爲單獨的觸發器,因此您並未試圖包含剛刪除的記錄或插入剛更新的記錄? – 2014-09-19 12:30:14

回答

1

觸發器不一定是單個查詢:它們可以包含更復雜的邏輯。 (這是回答你的問題,「我在哪裏將我的更新和設置命令合併到這個查詢中?」)所以你可以寫條件邏輯。畢竟,當ItemsProduced的記錄被刪除時,您可能會想要執行與ItemLookup不同的操作。您還可以爲不同的事件編寫單獨的觸發器。

您可能會想要使用觸發器中可用的內置inserteddeleted表。這將讓您處理完全受影響的記錄的值,而不是通過查看時間戳來確定它們,就像您在CROSS APPLY語句中所做的那樣。他們被描述爲here

(你也做了TOP 1沒有ORDER BY你的主查詢,所以你會得到什麼紀錄,「1」是無法預測的。)

請記住,以及,那每個數據操縱動作(如INSERT或UPDATE)會觸發一次觸發器,而不是每個更改的記錄都會觸發一次。因此,您可以對多行​​進行更改,只生成一次觸發器調用。

希望這會有所幫助。

+0

謝謝你,你給了我一些非常有幫助的指針,讓我以不同的方式思考事情,以一種很好的方式:)我感謝你的建議和專業知識。 – ENGR024 2014-09-21 19:22:53