【发布时间】:2020-10-27 01:06:58
【问题描述】:
我用 C# 编写了一个库存应用程序,并希望跟踪库存数量的变化。为此,我有两个表:tblInventory 和 tblInvChange。目前我有一个更新后触发器,它通过将以下内容添加到 tblInvChange 中效果很好:(使用 d. 表示已删除,i. 表示插入)d.lastphysical; i.lastphysical; d.数量; i.数量。
我的问题是,如果我在同一天返回并更改一件商品的数量,我将获得同一商品同一日期的两条记录。如果日期不存在,我想让触发器将记录插入到 tblInvChange 表中,如果存在则更新当前记录。
BEGIN
If(Select [fldlastPhysical] from deleted) <> (Select [fldLastPhysical] from inserted)
INSERT tblInvTracking(keyProductID, fldLocationId, fldLastPhysical, fldQuantity, fldInventoryChange, fldNewQuantity)
SELECT
D.keyProductID, D.fldLocationID, D.fldLastPhysical, d.fldQuantity, i.fldLastPhysical, i.fldQuantity
FROM
DELETED D JOIN INSERTED I ON D.keyProductID = I.keyProductID AND D.fldLocationID = I.fldLocationID;
Else
UPDATE tblInvTracking(keyProductID, fldLocationId, fldLastPhysical, fldQuantity, fldInventoryChange, fldNewQuantity)
SELECT
D.keyProductID, D.fldLocationID, D.fldLastPhysical, d.fldQuantity, i.fldLastPhysical, i.fldQuantity
FROM
DELETED D JOIN INSERTED I ON D.keyProductID = I.keyProductID AND D.fldLocationID = I.fldLocationID;
END
这是我的理解,但不起作用。一个关于正确方法的例子将不胜感激。
【问题讨论】:
-
Dale,我正在使用您的示例,以确保无需额外的 cmets 即可使其正常工作。你非常有帮助,我刚刚回到网站接受你的回答。注意:我对像 Marc 这样批评评论但不提供答案的人不满意。 sql-server 标记从一开始就存在。他的目的是什么?
-
@Charles 不用担心延迟接受这个答案,但请重新审视你的旧问题并接受答案,甚至在适用的情况下接受你自己的答案。您可以投票任何有用的答案,即使您不能接受他们的答案,也可以奖励他们。
-
如果您查看编辑历史记录(单击我名字上方的“昨天编辑”链接),您会发现当您最初发布问题时它没有标签“SQL Server”,这是由“a_horse_with_no_name”在随后的编辑中添加的。 SO 是一个非常没有人情味的网站,人们是非常实事求是的 - 最好不要把它当作个人。
-
还有一个错误我想不通;第 22 行 [第 6 行批处理开始] 操作数数据类型日期对于添加运算符无效。
标签: sql-server tsql database-trigger