C# Update触发器未在where子句中使用date,导致更新具有相同密钥id的所有记录,而不是仅更新具有当前日期的记录

C# Update触发器未在where子句中使用date,导致更新具有相同密钥id的所有记录,而不是仅更新具有当前日期的记录,c#,triggers,sql-server-2019-express,C#,Triggers,Sql Server 2019 Express,我有一个库存跟踪应用程序,我还跟踪每个地点的库存变化。库存项目可以位于多个位置。这是通过拥有一个跟踪数据库并在我的库存表上使用触发器来实现的。如果我更改一次项目的数量,触发器将按预期工作。如果我返回并再次更改同一位置的数量,则仅该位置的所有数量将更新为相同数量。这是我的扳机: INSERT tblInvTracking(keyProductID, fldLocationId, fldLastPhysical, fldQuantity, fldInventoryChange, fldNewQuan

我有一个库存跟踪应用程序,我还跟踪每个地点的库存变化。库存项目可以位于多个位置。这是通过拥有一个跟踪数据库并在我的库存表上使用触发器来实现的。如果我更改一次项目的数量,触发器将按预期工作。如果我返回并再次更改同一位置的数量,则仅该位置的所有数量将更新为相同数量。这是我的扳机:

INSERT tblInvTracking(keyProductID, fldLocationId, fldLastPhysical, fldQuantity, fldInventoryChange, fldNewQuantity)
    SELECT D.keyProductID, I.fldLocationID, D.fldLastPhysical, d.fldQuantity, i.fldLastPhysical, i.fldQuantity
    FROM DELETED D
    JOIN INSERTED I ON D.keyProductID = I.keyProductID
    WHERE D.fldLastPhysical <> i.fldLastPhysical AND d.fldLocationID = i.fldLocationID;

UPDATE tblInvTracking 
    SET fldNewQuantity = (SELECT inserted.fldQuantity FROM inserted)
    FROM deleted d
    JOIN inserted i ON D.keyProductID = I.keyProductID
    WHERE d.fldLastPhysical = i.fldLastPhysical AND tblInvTracking.keyProductID = i.keyProductID AND tblInvTracking.fldLocationID = i.fldLocationID;
由于INSERT语句执行正确,我知道WHERE子句起作用。问题必须出现在我的updatewhere子句中,该子句似乎忽略了d.fldLastPhysical=i.fldLastPhyiscal

注意:触发器是我的库存表的“更新时”触发器。当我在特定日期更改特定位置特定零件的数量时,触发器将在跟踪表中插入一条新记录。如果随后更改了数量,则在该日期该位置的该零件上不会创建新记录。这就是insert语句中where子句所做的事情,它是有效的

我想做的是,如果数量在同一地点的同一日期发生更改,则跟踪表中的数量将针对该日期进行更新。 看起来D.fldLastPhysical i.fldLastPhysical起作用,但D.fldLastPhysical=i.fldLastPhysical不起作用。针对所有日期更新特定位置的单个零件

如果不清楚,我深表歉意,但我必须理解你的回答并处理结果。因此,update语句中的where子句工作不正常


谢谢你,你犯了一个典型的错误——假设UPDATE触发器中插入的伪表只包含一行——情况往往不是这样

请看以下代码:

UPDATE tblInvTracking 
SET fldNewQuantity = (SELECT inserted.fldQuantity FROM inserted)
                     ********************************************
FROM deleted d
JOIN inserted i ON D.keyProductID = I.keyProductID
如果更新操作影响10行-您认为哪一行将用于获取inserted.fldQuantity值??这是不确定的-一个将被使用,所有其他被忽略。这让人倍感悲哀,因为您已经在以一种正确的、基于集合的方式访问查询中的Inserted和Deleted

那你为什么不直接用这个

UPDATE it
SET fldNewQuantity = i.fldQuantity 
FROM inserted i 
INNER JOIN tblInvTracking it ON it.keyProductID = i.keyProductID 
                             AND it.fldLocationID = i.fldLocationID;

既然您没有引用已删除伪表中的任何内容,为什么还要将其包含在更新中?另外:定义Inserted和tblInvTracking之间的连接条件在适当的内部连接中,而不是使用WHERE子句…

我修改了WHERE子句,以便d.fldLastPhysical使用今天的日期来解决问题。显然,i.fldLastPhysical出现了一些问题,导致了我最初的问题


感谢您的反馈,Marc。

这是关于插入表和删除表我一直不了解的一件事。它们中是否只有受影响的行?你说我不需要Update语句的where子句?那么,在inserted语句中是否需要where子句?@Charles:是的,inserted和Deleted伪表包含所有受触发操作影响的行。如果有插入20行的INSERT,则插入的伪表将正好包含这20行。不确定是否需要WHERE子句—毕竟,在UPDATE语句中,您根本不需要引用已删除伪表中的任何内容—因此您甚至可能不需要从已删除的d连接已插入的i—只需使用FROM Inserted i—但是您需要一些WHERE子句来连接正确的FROM Inserted行和您想要实际更新的tblInvTracking行….-看看我最新的回复Marc,你太棒了!在我的c中,我只更新一条记录;一个零件和一个位置。你帮了我很多。在我的例子中,删除和插入的伪表只有一条记录。我不认为我需要where子句。这并没有解决我的问题。不确定我是否清楚最初的问题。当我删除where子句时,所有位置的零件跟踪表中的所有记录都得到了更新。其中,d.fldLastPhysical=i.fldLastPhysical和tblInvTracking.keyProductID=i.keyProductID和tblInvTracking.fldLocationID=i.fldLocationID的条款;似乎忽略了fldLastPhysical,但使用了keyProductID和fldLocation。否则,它就成功了。我正在更新库存表中的字段,需要更新跟踪表中的字段。库存表中的第一个更新工作正常,第二个是问题。我已经解释了如何解决这个问题。最初,我只是在deleted.lastphytical不等于inserted.lastphytical时才尝试运行更新,这似乎是合乎逻辑的。由于我解释了我是如何通过其他评论来解决我的问题的,我不明白为什么我甚至不能在这个问题上投一票。