0

我有一个将记录从一个表插入到另一个表的过程。目标表有一个名为 LeadId 的标识列


Create Procedure prcInsertPrd
 As
  Begin
   Begin Transaction 
     Declare @Identity int
     Insert into Temp_ProductsArchive (column1,column2,column3)  select   
       (column1,column2,column3) 
    from Temp_Products

   if(@@Error=0)
     Begin
       Commit  
     End
   else
     Begin
       Rollback
     End
  End

然后我编写了一个插入触发器,它将从插入的表中获取 LeadId 并将其插入到另一个具有其他值的表中 -


Alter TRIGGER trgInsertTopProducts
   ON  Temp_ProductsArchive
   AFTER INSERT
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
     declare @LeadId as int
     Select @LeadId=LeadId from inserted 
     print @LeadId

Insert into Temp_ProductsTop(column4,LeadID,Column5,column6) Select column4,@LeadID 'LeadID',column 5,column6 from Temp_Products
END
GO

问题是我得到的是第一个生成的 LeadiD,而不是所有的 LeadId。Temp_ProductsTop 表中的 LeadiD 列仅针对记录数重复此值

4

2 回答 2

2

你的触发器有一个大问题。当你编写一个触发器时,你必须假设它可能被多行调用。即该inserted表可能包含多于一行,这意味着您必须加入到插入的表中。

我不确定您要在代码中实现什么,但您需要重写如下内容:

   Alter TRIGGER trgInsertTopProducts  
    ON  Temp_ProductsArchive 
    AFTER INSERT AS
    BEGIN    
      SET NOCOUNT ON;    
      insert into Temp_ProductsTop 
        (ProductID,LeadID,ProductName,SupplierID,CategoryID,QuantityPerUnit,UnitPrice,UnitsInStock,UnitsOnOrder,ReorderLevel,Discontinued) 
      Select ProductID, inserted.LeadID, ProductName,SupplierID,CategoryID,QuantityPerUnit,UnitPrice,UnitsInStock,UnitsOnOrder,ReorderLevel,Discontinued 
      from 
        Temp_Products
        inner join inserted on inserted.Leadid = ?
    END

GO

在哪里 ?代表您加入的 table.column。是否要为每个 LeadId 添加 temp_products?

于 2009-01-17T12:51:46.120 回答
-2

" inserted" 是一个伪表,其中包含插入的每个项目的一行。触发器总共只触发一次,而不是每个插入的条目一次!

您可能需要使用游标来遍历插入的记录,一次处理一个。也许:

Alter TRIGGER trgInsertTopProducts
  ON Temp_ProductsArchive
  AFTER INSERT
AS
BEGIN
  -- SET NOCOUNT ON added to prevent extra result sets from
  -- interfering with SELECT statements.
  SET NOCOUNT ON;
  declare @LeadId as int
  declare c CURSOR READ_ONLY for
    select LeadId from inserted

  open c
  fetch next from c into @LeadId
  while @@FETCH_STATUS = 0
  BEGIN
    Insert into Temp_ProductsTop(ProductID,LeadID,ProductName,SupplierID,CategoryID,QuantityPerUnit,UnitPrice,UnitsInStock,UnitsOnOrder,ReorderLevel,Discontinued) Select ProductID,@LeadID 'LeadID',ProductName,SupplierID,CategoryID,QuantityPerUnit,UnitPrice,UnitsInStock,UnitsOnOrder,ReorderLevel,Discontinued from Temp_Products
    fetch next from c into @LeadId
  END
  close c
  deallocate c
END

(请注意,我只是在这里输入的,还没有经过语法检查或测试)

于 2009-01-17T12:50:27.107 回答