2016-10-17 195 views
1

美好的一天我有一個外部的程序存儲SQL中的信息,我試圖做一個觸發器,當表中的某些字段發生更改時更新表。SQL觸發器更新

因此,我有一列Contractual Amount應該每更新一次ufAPCHANG1EAMNT,ufAPHANGE2AMNT和的任何值更改。

一個人可以更改這些值中的一個或全部,並且可以是+ ve或-ve,如果它們是對這些字段的任何更改,則應該相應地更新Contractual Amount,但添加+ ve金額並減去負值。

請你可以檢查我的代碼,讓我知道我哪裏出錯了。

ALTER trigger [dbo].[trgContractualAmt] 
ON [dbo].[Vendor] 
AFTER UPDATE 
AS 
    declare 
     @IdI integer, 
     @value1 decimal, 
     @Value2 decimal, 
     @value3 decimal, 
     @sum decimal, 
     @total decimal 

    SELECT 
     @IdI = i.DCLink, 
     @value1 = i.ufAPCHANGE1AMT, 
     @Value2 = i.ufAPCHANGE2AMNT, 
     @value3 =i.ufAPCHANGE3AMNT, 
     @total = i.ufAPContAmt 
    FROM 
     inserted i 
BEGIN 
    IF TRIGGER_NESTLEVEL() > 1 
     RETURN 

    IF @value1 <> (select ufAPCHANGE1AMT from Vendor where DCLink = @IdI) 
      UPDATE Vendor 
      SET ufAPContAmt = ufAPContAmt + @value1 
      where DCLink = @IdI 

     if @Value2 <> (select ufAPCHANGE2AMNT from Vendor where DCLink = @IdI) 
      UPDATE Vendor 
      SET ufAPContAmt = ufAPContAmt + @value2 
      where DCLink = @IdI 

     if @Value3 <> (select ufAPCHANGE3AMNT from Vendor where DCLink = @IdI) 
      UPDATE Vendor 
      SET ufAPContAmt = ufAPContAmt + @value3 
      where DCLink = @IdI   
END 
+3

你的觸發器有** **主要中的缺陷,你似乎認爲它會被稱爲**每排一次* * - 事實並非如此。觸發器將在每個語句**中觸發一次**,所以如果你的UPDATE語句影響了25行,你將觸發**觸發**一次,但是,然後「插入」和「刪除」將分別包含25行。您的代碼在這25行中選擇哪一個? 'SELECT ..... FROM Inserted' - 這是非確定性的。你需要重寫你的觸發器來考慮這個問題! –

+0

謝謝@marc_s,但如果您檢查這是更新該特定行時,我插入只有一行。 –

+0

標記您正在使用的dbms。該代碼看起來不像ANSI SQL。 – jarlh

回答

1

我會建議在可能時使用簡單的查詢:

ALTER TRIGGER dbo.trgContractualAmt ON dbo.Vendor 
    AFTER UPDATE 
AS 
    BEGIN 
     UPDATE 
      V 
     SET 
      ufAPContAmt += CASE WHEN (V.ufAPCHANGE1AMT <> I.ufAPCHANGE1AMT) 
           THEN I.ufAPCHANGE1AMT 
           ELSE 0 
          END 
      + CASE WHEN (V.ufAPCHANGE2AMNT <> I.ufAPCHANGE2AMNT) 
        THEN I.ufAPCHANGE2AMNT 
        ELSE 0 
       END 
      + CASE WHEN (V.ufAPCHANGE3AMNT <> I.ufAPCHANGE3AMNT) 
        THEN I.ufAPCHANGE3AMNT 
        ELSE 0 
       END 
     FROM 
      Vendor V 
     INNER JOIN inserted I 
      ON V.DCLink = I.DCLink; 

    END; 
+0

您是否真的需要Where條件,請檢查 –

+0

對不起這是Gerald的代碼剩下的。我編輯了我的答案,刪除。 謝謝 – Kilren

+0

謝謝@Kilren正是我需要的...... –