2013-10-16 56 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