3

ステートメントが 0 を超える値を返すCustomerContact場合、テーブルに挿入される行を変更 (Set Deleted = 1) したいと考えています。SELECT

私は以下を持っていますが、テストされていません:

CREATE TRIGGER mark_cust_contact_deleted ON CustomerContact
AFTER INSERT AS
BEGIN
DECLARE @numrows INT;

    /* Determine if order matches criteria for marking customer contact as DELETED immediately */
    SELECT @numrows = COUNT(*)
    FROM [Order] o
    JOIN OrderMeterDetail om
          ON o.OrderID = om.OrderID
    WHERE o.WorkTypeID = 3 AND o.WorkActionID = 26 AND o.WorkStageID IN (109, 309, 409)
    AND om.MeterDetailTypeID = 1 AND om.MeterLocationID IN (2, 4)
    AND o.orderid IN (SELECT OrderID FROM INSERTED);

    /* If the order matches the criteria, mark the customer contact as deleted */
    IF (@numrows >= 1)

        UPDATE CustomerContact
        SET Deleted = 1
        WHERE CustomerContactID IN (SELECT CustomerContactID FROM INSERTED);

END

IF私のステートメント内では、挿入によって作成されたレコードの新しく挿入された IDFROM INSERTEDが返されると仮定して、 を使用しています。

この声明について 2 つの質問があります。

  • ステートメントのこの部分は、UPDATE挿入されたばかりのレコードを実行しCustomerContactますか?

    UPDATE CustomerContact SET Deleted = 1 WHERE CustomerContactID IN (SELECT CustomerContactID FROM INSERTED);

  • SELECTこれは、ステートメントの結果に基づいて挿入されたばかりの行に変更を加えるのに正しいと見なされる方法ですか?

CustomerContactID自動インクリメント主キー列です。

4

3 に答える 3

2

「挿入されたレコードだけ」と言います。Inserted複数のレコードを含めることができます。1 つしかない場合、トリガーは期待どおりに機能します。しかし、複数ある場合はそうではありません。

update私はあなたのロジックを次の行に沿って単一のステートメントに書き直します...

 Update CustomerContact
 Set Deleted = 1
 From CustomerContact
       inner join inserted on CustomerContact.CustomerContactID = inserted.CustomerContactID
       inner join orders on inserted.OrderID = orders.OrderID
 where
     -- some criteria.
于 2013-10-16T10:14:26.403 に答える
1
CREATE TRIGGER mark_cust_contact_deleted ON CustomerContact
AFTER INSERT AS
BEGIN
DECLARE @numrows INT;

    /* Determine if order matches criteria for marking customer contact as DELETED immediately */
    -- Get all the records into a temp table 
    SELECT * INTO #Temp
    FROM inserted
    Declare @ID int;

    SELECT @numrows = COUNT(*)
    FROM [Order] o
    JOIN OrderMeterDetail om
          ON o.OrderID = om.OrderID
    WHERE o.WorkTypeID = 3 AND o.WorkActionID = 26 AND o.WorkStageID IN (109, 309, 409)
    AND om.MeterDetailTypeID = 1 AND om.MeterLocationID IN (2, 4)
    AND o.orderid IN (SELECT OrderID FROM #Temp);
 IF (@numrows >= 1)
  BEGIN
    WHILE EXISTS (SELECT TOP 1 * FROM #Temp)
    BEGIN

    SELECT TOP 1 @ID = ID FROM #Temp


    /* If the order matches the criteria, mark the customer contact as deleted */


        UPDATE CustomerContact
        SET Deleted = 1
        WHERE CustomerContactID IN (SELECT CustomerContactID FROM #Temp WHERE ID = @ID);

        DELETE FROM #Temp WHERE ID = @ID
    END
  END   
     DROP TABLE #Temp
END

このようなことができると思います。コードを微調整して、ニーズにさらに合わせてください。これが役立つことを願っています。

于 2013-10-16T10:29:08.107 に答える
0

この問題を解決するために使用した最終的な解決策は次のとおりです。

CREATE TRIGGER mark_cust_contact_deleted ON CustomerContact
AFTER INSERT AS
BEGIN

    UPDATE CustomerContact
    SET Deleted = 1
    FROM CustomerContact cc
        JOIN inserted i
            ON cc.CustomerContactID = i.CustomerContactID
        JOIN [Order] o
            ON i.OrderID = o.OrderID
        JOIN OrderMeterDetail om
            ON i.OrderID = om.OrderID
    WHERE o.WorkTypeID = 3 AND o.WorkActionID = 26 AND o.WorkStageID IN (109, 309, 409)
    AND om.MeterDetailTypeID = 1 AND om.MeterLocationID IN (2, 4)

END
于 2014-01-13T14:31:59.367 に答える