0

あるテーブルから別のテーブルにレコードを挿入するこの手順があります。宛先テーブルには、LeadId という ID 列があります


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

問題は、すべての LeadIds ではなく、最初に生成された 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" は、挿入された各アイテムの行を含む疑似テーブルです。トリガーは、挿入されたエントリごとに 1 回ではなく、合計 1 回だけ起動します。

おそらくカーソルを使用して、挿入されたレコードをループし、一度に 1 つずつ処理する必要があります。多分:

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 に答える