2016-09-13 59 views
0

我有一個觸發器管理來自另一個表的批量加載。將大量的行插入到「項目」表中時。觸發器被觸發,但是當插入表中的行已經存在時,條件不起作用。如果條件不起作用在觸發器

此觸發器的用途是將插入到項目表中的新行插入到vat_matrix表中。如果vat_matrix表中存在行,則使用項目表中的新值更新它們。

我已經嘗試了幾個選項,發現遊標是遍歷插入行的唯一解決方案。這工作,但我不能讓if條件工作來更新現有的行。

有什麼建議嗎?

SET ANSI_NULLS ON 

GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER TRIGGER [dbo].[update_vat] ON [dbo].[projects] 
FOR UPDATE, INSERT 
AS 

DECLARE @project AS VARCHAR(25) 
DECLARE @client AS VARCHAR(25) 
DECLARE @dim2 AS VARCHAR(25) 
DECLARE @period_from AS INT 
DECLARE @period_to AS INT 
DECLARE @status AS CHAR(1) 
DECLARE @user_id AS VARCHAR(25) 
DECLARE @unit_id AS VARCHAR(25) 
DECLARE @sequence_no AS INT 

SELECT @project = project, 
@client = client, 
@dim2 = dim2, 
@period_from = period_from, 
@period_to = period_to, 
@status = status, 
@user_id = user_id, 
@unit_id = unit_id 
FROM inserted 

--FIND MAXIMUM VALUE FOR SEQUENCE NUMBER 
SET @sequence_no = (SELECT MAX(v) FROM (SELECT sequence_no FROM agldefmatdet WHERE matrix_id = 11) AS value(v)); 

BEGIN 

DECLARE tbl_cursor CURSOR LOCAL FOR 

     SELECT project, client, dim2, period_from, period_to, status, user_id, unit_id FROM inserted 


    SET NOCOUNT ON; 

    IF EXISTS (SELECT * FROM inserted WHERE inserted.project = @project) AND NOT EXISTS (SELECT * FROM deleted WHERE deleted.project = @project) 
    BEGIN 

    OPEN tbl_cursor 
    FETCH NEXT FROM tbl_cursor INTO @project, @client, @dim2, @period_from, @period_to, @status, @user_id, @unit_id 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 

    INSERT INTO [dbo].[vat_matrix] 
     (att_val_from_1, 
      att_val_from_2, 
      att_val_from_3, 
      att_val_from_4, 
      att_val_to_1, 
      att_val_to_2, 
      att_val_to_3, 
      att_val_to_4, 
      att_value_1, 
      att_value_2, 
      att_value_3, 
      att_value_4, 
      client, 
      dim_value, 
      last_update, 
      matrix_id, 
      period_from, 
      period_to, 
      sequence_no, 
      status, 
      user_id) 
    SELECT @project, 
      '', 
      '', 
      '', 
      @project, 
      '', 
      '', 
      '', 
      @project, 
      '', 
      '', 
      '', 
      @client, 
      @dim2, 
      GETDATE(), 
      '11', 
      '0', 
      '0', 
      @sequence_no + 1, 
      @status, 
      @user_id 

     FETCH NEXT FROM tbl_cursor INTO @project, @client, @dim2, @period_from, @period_to, @status, @user_id, @unit_id 

    --RETURN; 

    END 

    CLOSE tbl_cursor 
    DEALLOCATE tbl_cursor 

END 

    IF EXISTS (SELECT * FROM inserted WHERE inserted.project = @project) AND EXISTS (SELECT * FROM deleted WHERE deleted.project = @project) 
    BEGIN 

    OPEN tbl_cursor 
    FETCH NEXT FROM tbl_cursor INTO @project, @client, @dim2, @period_from, @period_to, @status, @user_id, @unit_id 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 

    UPDATE vat_matrix 
     SET dim_value = @dim2, 
       last_update = GETDATE(), 
       period_from = @period_from, 
       period_to = @period_to, 
       status = @status, 
       user_id = @user_id 
       WHERE att_val_from_1 = @project 
       AND matrix_id = '11' 
       AND client = 'LU' 

     FETCH NEXT FROM tbl_cursor INTO @project, @client, @dim2, @period_from, @period_to, @status, @user_id, @unit_id 
    END 

    CLOSE tbl_cursor 
    DEALLOCATE tbl_cursor 

    --RETURN; 
END 



END; 
+0

'觸發器'內的'CURSOR'。看起來不好主意 –

+0

我發現它是遍歷Tigger中插入表中新行的唯一方法。現在唯一的問題是如果條件 – user3565164

回答

0

正如你所說的,只有當一行插入一行時,觸發器才能工作。嘗試使用此觸發器

ALTER TRIGGER [dbo].[update_vat] 
ON [dbo].[projects] 
FOR UPDATE, INSERT 
AS 
    BEGIN 
     DECLARE @sequence_no AS INT 

     --FIND MAXIMUM VALUE FOR SEQUENCE NUMBER 
     SET @sequence_no = (SELECT Max(sequence_no) 
            FROM agldefmatdet 
            WHERE matrix_id = 11)); 

     IF EXISTS (SELECT * 
       FROM inserted) 
     AND NOT EXISTS (SELECT * 
         FROM deleted) 
     BEGIN 
      INSERT INTO [dbo].[vat_matrix] 
         (att_val_from_1, 
         att_val_from_2, 
         att_val_from_3, 
         att_val_from_4, 
         ..... 
         user_id) 
      SELECT project, 
        '', 
        '', 
        '', 
        ..... 
        user_id 
      FROM inserted 
     END 

     IF EXISTS (SELECT * 
       FROM inserted) 
     AND EXISTS (SELECT * 
        FROM deleted) 
     BEGIN 
      UPDATE V 
      SET dim_value = i.dim2, 
        last_update = Getdate(), 
        period_from = i.period_from, 
        period_to = i.period_to, 
        status = i.status, 
        user_id = i.user_id 
      FROM vat_matrix V 
        JOIN inserted i 
        ON v.att_val_from_1 = i.project 
      WHERE matrix_id = '11' 
        AND client = 'LU' 
     --RETURN; 
     END 
    END 
+0

感謝Prdp,不幸的是,這將只在vat_matrix表中添加一行,但從批量插入添加項目表中的所有行。這是光標作爲觸發器的原因,每5行只插入一次。 – user3565164

+0

@ user3565164 - 我無法在當前觸發器中找到該狀況。我的代碼和你的觸發器一樣。除了它會在語句級別工作 –

+0

嗨Prdp,感謝您的答覆。對不起 - 這可行,但增量矩陣中的現有行不會更新。他們只是再次加入 - 對於項目表也是如此。它讓我瘋狂! – user3565164