Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server MSSQL触发器-在插入时更新新插入的记录_Sql Server_Triggers_Sql Update_Sql Insert_Last Insert Id - Fatal编程技术网

Sql server MSSQL触发器-在插入时更新新插入的记录

Sql server MSSQL触发器-在插入时更新新插入的记录,sql-server,triggers,sql-update,sql-insert,last-insert-id,Sql Server,Triggers,Sql Update,Sql Insert,Last Insert Id,如果SELECT语句返回的值大于0,我希望对插入到我的表CustomerContact中的行设置修改集Deleted=1 我有以下几点,但它仍然没有经过测试: CREATE TRIGGER mark_cust_contact_deleted ON CustomerContact AFTER INSERT AS BEGIN DECLARE @numrows INT; /* Determine if order matches criteria for marking customer c

如果SELECT语句返回的值大于0,我希望对插入到我的表CustomerContact中的行设置修改集Deleted=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 */
    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,假设这将返回insert创建的记录的新插入id

关于这一声明,我有两个问题:

语句的这一部分是否仅对记录执行更新 刚刚插入CustomerContact的

更新CustomerContact 设置已删除=1 其中CustomerContactID在选择CustomerContactID FROM INSERTED

根据SELECT语句的结果对刚插入的行进行更改时,这样做是否正确


CustomerContactID是一个自动递增的主键列。

您说的只是插入的记录。插入的记录可以包含多个记录。如果只有一个,那么您的触发器将按照您的预期工作。但如果不止一个,就不会了

我会把你的逻辑改写成一个更新语句

 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.

我认为您可以这样做,调整代码以进一步满足需要,希望这会有所帮助。

以下是我用来解决此问题的最终解决方案:

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

有没有办法为每一行执行触发器?好主意!我会给出一个例子,你能解释一下,如果插入了多行,为什么最初的OP尝试不起作用吗?我看不到,他在插入的SELECT orderid中设置@numrows where o.orderid查找@numrows>=1,并在插入的SELECT CustomerContactID中更新where CustomerContactID它到底会在哪里失败?当然,使用连接的语法更漂亮@DrCopyPaste,因为如果一条记录与where条件匹配,那么所有记录都将被标记为已删除,而不是仅与条件匹配的记录。@PODLUSKA非常感谢您的帮助。我已经发布了一个潜在的解决方案。如果您能快速浏览一下,看看您的想法,我将不胜感激,对不对谢谢你抽出时间来看看我的问题+1.
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