2013-10-16 55 views
3

更新新插入的記錄我想作出修改(集中刪除= 1)行插入我的表CustomerContact如果SELECT語句返回高於0.1MSSQL觸發 - 在INSERT

我有以下的,但還有待驗證:

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聲明,我使用FROM INSERTED,假設這將返回新插入的ID對於由插件形成記錄。

我對此聲明有兩個問題:

  • 將把該語句的這部分執行剛插入CustomerContactUPDATE只是記錄 ?

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

  • 這是將被視爲正確的做出改變,以剛剛根據SELECT語句的結果插入行的方式嗎?

CustomerContactID是一個自動遞增的主鍵列。

回答

2

你說「只是插入的記錄」。 Inserted可以包含多條記錄。如果只有一個,那麼您的觸發器將按照您的預期運行。但是,如果有不止一個,它不會。

我會重寫你的邏輯到沿線的一個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. 
+0

是否有執行每行的觸發方式? – Luke

+0

好主意!我會給你一個答案 – Luke

+0

你能解釋一下,如果插入多行,爲什麼OP的原始嘗試不起作用?我沒有看到它,他設置'@ numrows'其中'o.orderid IN(SELECT OrderID FROM INSERTED)'尋找'IF(@numrows> = 1)'並更新'Where CustomerContactID IN(SELECT CustomerContactID FROM INSERTED)它會在哪裏完全失敗?使用'JOIN's你的語法更漂亮;) – DrCopyPaste

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 

我認爲你可以做這樣的事情,調整代碼futher西裝的需求,希望這將有所幫助。

+0

感謝您花時間看我的問題! +1 – Luke

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