2016-05-02 16 views
0

イベントが完了した場合にテーブルを埋めるためにSQL Serverにトリガーを作成する必要があります。SQL Serverでイベントトリガー後に挿入

マイコード:

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; 

それはいくつかのエラーがスローされます。

ターゲット:私は連絡先でいっぱいのテーブルを持っている任意の提案が高く評価されIDESITOが18で、新しいテーブルのカウントが< 3.

であれば、私は、別のテーブルにこれらのレコードを挿入する必要があります。

+0

それがどのようなエラーを与えず、カウント(@IDPRAT)< 3を達成しようとしているのかわからないのですか? –

+0

まず、 'inserted'はおそらく多くの行を持つテーブルです。トリガーは単一の値ではなく、テーブルを処理する必要があります。 – Serg

+2

あなたのトリガーには、**メジャー**の欠陥があります。**行ごとに** **一度**と呼ばれると思われるようです。トリガは**文ごとに** **起動します。したがって、このトリガを起動させる 'INSERT'文が25行挿入された場合、トリガは一度**発生しますが、' Inserted'擬似テーブルは25行あります。あなたのコードがここで選択する25行のうちどれですか? 'SELECTテレフォンFROMが挿入されました' - それは非決定論的です、あなたは**任意の行**を得て、あなたは**すべての他の行を無視します**。これを考慮に入れてトリガーを書き直す必要があります。 –

答えて

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; 

私はあなたが私はあなただけ上位3行をしたいかもしれないと思い

関連する問題