如果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
,假设这将返回插入记录的新插入id。关于这个语句,我有两个问题:
这个语句部分是否只会执行对刚刚插入到CustomerContact
中的记录进行UPDATE
?
UPDATE CustomerContact
SET Deleted = 1
WHERE CustomerContactID IN (SELECT CustomerContactID FROM INSERTED);
这是根据SELECT
语句结果对刚刚插入的行进行更改的正确方式吗?
CustomerContactID
是自动递增的主键列。
o.orderid IN (SELECT OrderID FROM INSERTED)
设置了@numrows
,寻找IF (@numrows >= 1)
并更新WHERE CustomerContactID IN (SELECT CustomerContactID FROM INSERTED)
,那么它会在哪里失败呢?当然,你使用JOIN
的语法更美观 ;) - DrCopyPastewhere
条件,那么所有的记录都会被标记为已删除,而不仅仅是匹配条件的记录。 - podiluskaAND o.OrderID = i.CustomerContactID
,并将其移到适当的连接位置。 - podiluska