2017-03-31 139 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;