0

我是触发器的新手,并且正在设置触发器以REQ_L在插入满足特定参数的记录时更新表 ()。要更新的值REQ_L是从具有匹配键的单独表中提取的。

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它,如果它符合触发器中的条件,它将使用in作为键更新COMMODITY_CODEfrom 。REQ_LCOMMODITY_CODEXREF_CITEM_NUMBER

不再锁定并切换到使用插入的表。好消息是不再出现死锁,坏消息是它仍然没有更新表。更新的 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
4

2 回答 2

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

好吧,我可能错了,但我不禁认为您正在更新的表应该出现在语句的 from 子句中。

这个怎么样:

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'
于 2012-12-21T02:48:02.643 回答
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 中使用它们,您就不会以数据集的心态编写查询。大多数时候是;有时它们是无法避免的。

于 2012-12-21T02:38:11.320 回答