2012-12-20 63 views
0

我是新來的觸發器,並且正在設置觸發器來更新表(REQ_L),當插入的記錄符合具體參數。在REQ_L中更新的值是從具有匹配鍵的單獨表中提取的。T-SQL觸發器 - 使用單獨的表更新表,可以多行插入

create table REQ_L (item_number varchar(20), 
        commodity_code varchar(20), 
        vendor_id varchar(20), 
        item_source varchar(20)); 

create table XREF_C (item_number varchar(20), 
        commodity_code varchar(20), 
        xref_type varchar(20)); 

我想它當一個記錄插入REQ_L的,如果滿足觸發條件將是使用ITEM_NUMBER爲關鍵與COMMODITY_CODE更新從REQ_LCOMMODITY_CODEXREF_C

不再鎖定並切換到使用插入的表格。好消息是沒有更多的死鎖,壞的是它仍然沒有更新表格。更新SQL觸發器嘗試:

CREATE TRIGGER WBM 
    ON REQ_L 
    AFTER INSERT 
    AS 
    IF EXISTS (SELECT * FROM inserted WHERE VENDOR_ID = 'W7315' 
       AND ITEM_SOURCE = 'XML' 
       AND COMMODITY_CODE NOT LIKE '%-%') 
    BEGIN 
     UPDATE REQ_L 
      SET COMMODITY_CODE = (SELECT distinct CODE_2 
            FROM XREF_C xc, inserted i 
            WHERE i.ITEM_NUMBER = xc.CODE_1 
            AND xc.XREF_TYPE = 'WBM') 
     FROM XREF_C xc, inserted i 
     WHERE i.ITEM_NUMBER = xc.CODE_1 
     END 
GO 
+0

首先,我想通過 '鎖定' 你的意思是死鎖?其次,'從XREF_C xc,REQ_L rl'是古老的古代語法。你應該使用ISO標準的JOIN語法。對這個舊語法的支持將在某個時候消失。然而,最重要的是你需要閱讀觸發器和'INSERTED'僞指令。你試圖在這裏更新整個'REQ_L'表,這幾乎可以肯定你在哪裏死鎖。 – DeanGC

+0

「INSERT」觸發器通常引用「插入」表。在這種情況下,您可能想要將搜索限制到剛插入到'REQ_L'中的行。 REQ_L上還有一個'UPDATE'觸發器嗎?遞歸觸發器會變得討厭。 – HABO

+0

@DeanGC,是的,它是僵局。 HABO我已經閱讀了關於「插入」表的內容,但並不完全確定他們所引用的內容。此表上沒有遞歸觸發器。 – user1435281

回答

0

嘗試簡單地查詢您的查詢結構。我仍然不知道CODE_1和CODE_2是什麼,但這對我有用。

ALTER TRIGGER [dbo].[WBM] 
    ON [dbo].[REQ_L] 
    AFTER INSERT 
    AS 
    UPDATE REQ_L 
    SET  commodity_code = xc.commodity_code FROM INSERTED i   INNER JOIN   XREF_C xc ON i.Item_Number=xc.item_number 
         AND 
         xc.xref_type = 'WBM' 
         AND 
         i.VENDOR_ID = 'W7315' 
         AND 
         i.ITEM_SOURCE = 'XML' 
         AND 
         i.COMMODITY_CODE NOT LIKE '%-%' 

記住,IF陳述屬於在C#和Visual Basic - 如果您使用的是他們在SQL你是不是有一個數據集的心態寫你的查詢。大部分時間是;有時他們無法避免。

0

我同意上面的一般評論,但我在想你使用的邏輯看起來不順眼。您有:

UPDATE REQ_L 
     SET COMMODITY_CODE = (SELECT distinct CODE_2 
           FROM XREF_C xc, inserted i 
           WHERE i.ITEM_NUMBER = xc.CODE_1 
           AND xc.XREF_TYPE = 'WBM') 
    FROM XREF_C xc, inserted i 
    WHERE i.ITEM_NUMBER = xc.CODE_1 

嗯,我可能是錯的,但我不禁想到,你更新的表應在從語句的WHERE子句出現。

如何:

UPDATE rl 
SET Commodity_Code = x.Code_2 
FROM Req_L rl 
    INNER JOIN Inserted i ON --limit the join clause to the cols that have been inserted 
     rl.item_number = i.item_number and 
     rl.commodity_code = i.commodity_code and 
     rl.vendor_id = i.vendor_id and 
     rl.item_source = i.item_source 
    INNER JOIN XREF_C x ON L.item_number = x.item_number 
WHERE x.xref_type = 'WBM'