2016-05-02 10 views
0

Ich muss einen Trigger in SQL Server zum Ausfüllen einer Tabelle erstellen, wenn ein Ereignis abgeschlossen ist.Einfügen nach Ereignisauslöser in SQL Server

Mein Code:

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

ALTER TRIGGER [dbo].[Tr_EsportaMancatiContatti] 
ON [dbo].[Lav_CollaudiVodaf_StoricoMancatiContatti] 
AFTER INSERT 
AS 
BEGIN 
    DECLARE @IDPRATStorico INT; 
    DECLARE @IDPRAT INT; 
    DECLARE @CodRichiestaCRM INT; 
    DECLARE @IDESITO INT; 
    DECLARE @Telefono VARCHAR; 
    DECLARE @DataOraContatto INT; 

    SET NOCOUNT ON; 

    SET @IDPRATStorico = (SELECT IDPRATStorico FROM inserted); 
    SET @IDPRAT = (SELECT IDPRAT FROM inserted); 
    SET @CodRichiestaCRM = (SELECT CodRichiestaCRM FROM inserted); 
    SET @IDESITO = (SELECT IDESITO FROM inserted); 
    SET @Telefono = (SELECT Telefono FROM inserted); 
    SET @DataOraContatto = (SELECT DataOraContatto FROM inserted); 

    IF @IDESITO = 18 AND count(@IDPRAT) < 3 
    BEGIN 
     INSERT Lav_CollaudiVodaf_StoricoMancatiContatti 

     SET [email protected] 
     SET [email protected] 
     SET [email protected] 
     SET Telefono=Telefono 
     SET [email protected] 

     WHERE [email protected]; 
    END 

END; 

Es wirft einige Fehler.

Ziel: Ich habe eine Tabelle mit Kontakt gefüllt haben, ich brauche diese Aufzeichnung in einer anderen Tabelle einfügen, wenn die IDESITO 18 ist und die Zählung in der neuen Tabelle ist < 3.

Jeder Vorschlag ist willkommen.

+0

Welche Fehler geben ist das? –

+0

Zuerst ist "eingefügt" eine Tabelle mit möglicherweise vielen Zeilen. Der Trigger sollte Tabelle verarbeiten, keine einzelnen Werte. – Serg

+2

Ihr Auslöser hat ** MAJOR ** Fehler in dem Sie scheinen anzunehmen, dass es ** einmal pro Zeile ** genannt wird - das ist ** nicht ** der Fall. Der Trigger wird ** einmal pro Anweisung ** ausgelöst. Wenn also Ihre INSERT-Anweisung, die diesen Auslöser auslöst, 25 Zeilen einfügt, erhalten Sie den Trigger einmal ** ausgelöst, dann aber die "Eingefügte" Pseudo-Tabelle enthalten 25 Zeilen. Welche dieser 25 Zeilen wird Ihr Code hier auswählen? 'SELECT Telefono FROM inserted' - es ist nicht deterministisch, Sie erhalten ** eine beliebige Zeile ** und Sie werden ** ignorieren alle anderen Zeilen **. Sie müssen Ihren Trigger neu schreiben, um dies zu berücksichtigen! –

Antwort

0
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

ALTER TRIGGER [dbo].[Tr_EsportaMancatiContatti] 
ON [dbo].[Lav_CollaudiVodaf_StoricoMancatiContatti] 
AFTER INSERT 
AS 
BEGIN 

    SET NOCOUNT ON; 

     INSERT INTO Lav_CollaudiVodaf_StoricoMancatiContatti(
        IDPRATStorico, 
        CodRichiestaCRM, 
        IDESITO, 
        Telefono, 
        DataOraContatto 
     ) 
     SELECT TOP 3 
       IDPRATStorico, 
       CodRichiestaCRM, 
       IDESITO, 
       Telefono, 
       DataOraContatto 
     FROM INSERTED 
     WHERE IDESITO = 18 
END; 

Ich bin nicht sicher, was Sie versuchen, mit count (@IDPRAT) erreichen < 3. Ich denke, man könnte nur die Top 3 Zeilen wollen