2017-03-31 141 views
1

我的觸發器由於某種原因插入了4次,而最後一個僅被分組。基本上我想要做的是將信息插入到我的表中tbl_delete_Panel我想將這些數據分組並將其插入到tbl_delete_panel_Orderin中。SQL Server插入觸發器不止一次插入

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE Trigger[dbo].[deletePanelSQL] 
ON [dbo].[tbl_delete_Panel] 
AFTER INSERT 
AS 
BEGIN 
    /* Insert Summed Quantity for each stud or track into tbl_delete_panel for deletion. tbl_delete_panel trigger will be triggered */ 
    INSERT INTO tbl_delete_panel_Orderin (Part_Name, OrderID, SumOfQTY) 
     SELECT 
      tbl_delete_panel.Part_Name, tbl_delete_panel.OrderID, 
      Sum(tbl_delete_panel.QTY) AS SumOfQTY 
     FROM 
      tbl_delete_panel 
     GROUP BY 
      tbl_delete_panel.Part_Name, tbl_delete_panel.OrderID; 
END; 
+4

您保持插入來自'tbl_delete_panel'完整的行,每次這個觸發器被調用。你應該做的**是看看'Inserted'僞表,它可以包含多行,並插入這些行**(這是由觸發觸發器的語句新插入的) - 不是**整桌**每次! –

回答

1

現在,你一直從tbl_delete_panel插入全套行的,每到這個觸發觸發器。

應該做的,而不是是看Inserted僞表,可以和將包含多個行(所以你要處理這種情況,一個漂亮的,適當的基於集合的方法 - 沒有光標,沒有while循環!) - 並插入那些行(它們是由觸發器觸發的語句新插入的) - 不是每次都是整個表!

嘗試這樣:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE Trigger[dbo].[deletePanelSQL] 
ON [dbo].[tbl_delete_Panel] 
AFTER INSERT 
AS 
BEGIN 
    /* Insert summed quantity for each stud or track into tbl_delete_panel for deletion. tbl_delete_panel trigger will be triggered */ 
    INSERT INTO tbl_delete_panel_Orderin (Part_Name, OrderID, SumOfQTY) 
     SELECT 
      Part_Name, OrderID, 
      Sum(QTY) AS SumOfQTY 
     FROM 
      Inserted i 
     GROUP BY 
      Part_Name, OrderID; 
END;