2017-08-10 38 views
0

我有一個合併語句應該多次執行觸發器。合併語句和觸發器SQL Server 2012

我首先想到我的觸發器沒有執行,但是通過一些研究,我發現觸發器每個語句只觸發一次(觸發器是一個語句)。

但是所有的帖子都是舊的,我認爲現在可能有一個簡單的方法來讓我的觸發器執行多次。

那麼有什麼我可以添加到我的觸發器或我的合併聲明,使我的觸發器這樣做?

感謝

TRIGGER

TRIGGER [dbo].[Sofi_TERA_Trigger] 
    ON [dbo].[ZZ] 
    AFTER INSERT,UPDATE 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    IF EXISTS(SELECT 1 FROM inserted WHERE inserted.Statut LIKE '%CLOT%' OR inserted.Statut LIKE '%CLTT%' OR inserted.Statut LIKE '%CONF%') 
     BEGIN 
      DECLARE @Id int; 
      DECLARE @Matricule varchar(10); 
      DECLARE @IdAction int; 
      DECLARE @NumeroOF int; 
      SELECT @NumeroOF = inserted.Ordre from inserted; 

      DECLARE OF_CURSOR CURSOR 
       LOCAL STATIC READ_ONLY FORWARD_ONLY 
      FOR 
      SELECT Id,Log.Matricule,IdAction from Log inner join (select max(Id) as maxID,Matricule from LOG where Log.NumeroOF = @NumeroOF group by Matricule) maxID 
      on maxID.maxID = Log.Id where Log.NumeroOF = @NumeroOF; 

      OPEN OF_CURSOR 
      FETCH NEXT FROM OF_CURSOR INTO @Id,@Matricule,@IdAction 
      WHILE @@FETCH_STATUS = 0 
      BEGIN 
       IF @IdAction!=13 
        BEGIN 
         IF @IdAction<=2 
         BEGIN 
          insert into Log(NumeroOF,Matricule,IdAction,Date,EstAdmin) values (@NumeroOF,@Matricule,13,GETDATE(),1); 
         END 
         ELSE 
         BEGIN 
          insert into Log(NumeroOF,Matricule,IdAction,Date,EstAdmin) values (@NumeroOF,@Matricule,2,GETDATE(),1); 
          insert into Log(NumeroOF,Matricule,IdAction,Date,EstAdmin) values (@NumeroOF,@Matricule,13,GETDATE(),1); 
         END 
        END    
       FETCH NEXT FROM OF_CURSOR INTO @Id,@Matricule,@IdAction 
      END 

      CLOSE OF_CURSOR; 
      DEALLOCATE OF_CURSOR; 
    END 
END 

MERGE語句

Merge ZZ AS TARGET USING ZZTemp AS SOURCE 
ON (Target.Operation=Source.Operation AND Target.Ordre=Source.Ordre) 
WHEN MATCHED THEN 
UPDATE SET TARGET.DateTERA=SOURCE.DateTERA, TARGET.MatTERA=SOURCE.MatTERA, TARGET.MatTERC=SOURCE.MatTERC 
WHEN NOT MATCHED THEN      
INSERT(Operation,Ordre,ElementOTP,Article,DesignationOF,PosteTravail,ValeurTemps,DHT,Statut,StatutOF,TexteActivite,DateTERA,MatTERA,MatTERC,StatutMat)         
VALUES(SOURCE.Operation,SOURCE.Ordre,SOURCE.ElementOTP,SOURCE.Article,SOURCE.DesignationOF,SOURCE.PosteTravail,SOURCE.ValeurTemps,SOURCE.DHT, 
SOURCE.Statut,SOURCE.StatutOF,SOURCE.TexteActivite,SOURCE.DateTERA,SOURCE.MatTERA,SOURCE.MatTERC,SOURCE.StatutMat); 
+1

爲什麼你想讓觸發器多次觸發? – Xedni

+0

因爲對於在我的表「ZZ」中添加的每一行,我可能需要在另一個表中添加新的:) –

+0

並且合併更新/插入約。 2000 rows –

回答

1

您的問題是,光標不正確的寫入處理的數據集。任何設置插入或刪除標量變量的值形式的觸發器都不正確,並且由於數據完整性的原因必須重寫。這個觸發器是越野車。期。沒有必要重寫它(以及其他使用相同技術的其他程序)。

您的觸發器中的代碼應該是這樣的:

INSERT INTO Log(NumeroOF,Matricule,IdAction,Date,EstAdmin) 
SELECT max(Id),l.Matricule,l.IdAction, 13,GETDATE(),1 
FROM Log l 
JOIN Inserted i ON l.NumeroOF = i.Ordre 
WHERE i.Statut LIKE '%CLOT%' OR i.Statut LIKE '%CLTT%' OR i.Statut LIKE '%CONF%' 
GROUP BY l.Matricule,l.IdAction 

INSERT INTO Log(NumeroOF,Matricule,IdAction,Date,EstAdmin) 
SELECT max(Id),l.Matricule,l.IdAction, 2,GETDATE(),1 
FROM Log l 
JOIN Inserted i ON l.NumeroOF = i.Ordre 
WHERE IdAction<=2 
WHERE i.Statut LIKE '%CLOT%' OR i.Statut LIKE '%CLTT%' OR i.Statut LIKE '%CONF%' 
GROUP BY l.Matricule,l.IdAction 

確保與單記錄和多個記錄插入到測試所有觸發器應該進行測試。一旦你確信觸發器是正確的,然後嘗試你的MERGE。

+0

感謝您引導我,不用擔心我在測試服務器上+我可以回滾;) –