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に、トリガーの基準を満たしていれば、をキーとして使用してCOMMODITY_CODEからREQ_Lを更新します。COMMODITY_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

クエリ構造を単純化してみてください。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 '%-%'

ステートメントは C# と Visual Basic に属していることを思い出してくださいIF。SQL でステートメントを使用している場合は、データセットの考え方でクエリを記述していません。ほとんどの場合はそうです。避けられないこともあります。

于 2012-12-21T02:38:11.320 に答える
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 に答える