Как получить значение идентификатора столбца - SQL - PullRequest
0 голосов
/ 17 января 2009

У меня есть эта процедура, которая вставляет записи из одной таблицы в другую. таблица назначения имеет столбец идентификаторов с именем 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, а не все LeadIds. В столбце LeadiD в таблице Temp_ProductsTop повторяется только это значение для количества записей

Ответы [ 2 ]

2 голосов
/ 17 января 2009

У вас серьезная проблема с триггером. Когда вы пишете триггер, вы должны предполагать, что он может быть вызван с несколькими строками. Т.е. таблица 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. Хотите добавить temp_products для каждого LeadId?

0 голосов
/ 17 января 2009

"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

(обратите внимание, я только что набрал это здесь, и синтаксис не проверялся и не проверялся)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...