SQL在添加新发票时更新库存

SQL在添加新发票时更新库存,sql,sql-server,triggers,Sql,Sql Server,Triggers,当我按照预期使用以下触发器更新当前库存时。但当我更新相同的值两次时,更新的值是错误的 50-2=48,但其显示为50-2=47 ALTER TRIGGER [dbo].[trig_invoice_update] ON [dbo].[tblInvoice] AFTER INSERT AS BEGIN UPDATE p SET quantity = COALESCE(d.quantity, 0) - COALESCE(i.quantity, 0) FROM tblPur

当我按照预期使用以下触发器更新当前库存时。但当我更新相同的值两次时,更新的值是错误的

50-2=48,但其显示为50-2=47

ALTER TRIGGER [dbo].[trig_invoice_update] 
ON [dbo].[tblInvoice]
AFTER INSERT 
AS
BEGIN
    UPDATE p
    SET quantity = COALESCE(d.quantity, 0) - COALESCE(i.quantity, 0) 
    FROM tblPurchase p 
    LEFT JOIN 
        (SELECT i.itemName, SUM(i.quantity) AS quantity
         FROM tblInvoice i
         GROUP BY i.itemName) i ON p.itemName = i.itemName 
    LEFT JOIN
        (SELECT d.itemName, SUM(d.quantity) AS quantity
         FROM tblPurchase d
         GROUP BY d.itemName) d ON p.itemName = d.itemName
    WHERE d.quantity > 1
       OR i.quantity > 1;
END

您试图从tblPurchase表格的数量中减去tblinvoice表格中所有可用数量的总和。相反,您只需要减去当前插入的数量。请尝试以下代码。希望你的问题能得到解决

ALTER TRIGGER [dbo].[trig_invoice_update] 
ON [dbo].[tblInvoice]
AFTER INSERT 
AS
BEGIN
    UPDATE p
    SET quantity = COALESCE(d.quantity, 0) - COALESCE(i.quantity, 0) 
    FROM tblPurchase p 
    LEFT JOIN 
        (SELECT itemName, quantity
         FROM inserted i       ) i ON p.itemName = i.itemName 
    LEFT JOIN
        (SELECT d.itemName, SUM(d.quantity) AS quantity
         FROM tblPurchase d
         GROUP BY d.itemName) d ON p.itemName = d.itemName
    WHERE d.quantity > 1
       OR i.quantity > 1;
END

WHERE
子句不正确。正确的比较应该是
0
,而不是
1

WHERE d.quantity > 0 OR i.quantity > 0
或者,假设数量为整数,则应使用
=

WHERE d.quantity >= 1 OR i.quantity >= 1

为了更好地理解您的问题,请共享表结构。不知何故,您应该在触发器中加入插入的
伪表,以了解插入了哪些行。。。。。。现在,你总是更新整个表!(即使只插入少数几行……)