如何在触发器或存储过程中使用两个更新语句

三达万佛法

我想在下面的触发器中使用两个更新语句。但是我的问题是我有库存管理系统。在我的SQL Server 2014中,我有两个表,如tblPurchasetblProductStock当我开具发票时,我tblProductStock会自动更新。

例如:我的tblPurchase桌子上有20台戴尔笔记本电脑如果我卖5台戴尔笔记本电脑。现在我tblProductStock是15岁。没关系。但是,当我更新tblPurchase表格时,我想从中扣除购买金额ProductStock

例如:现在我的tblProductStock桌子上有15台戴尔笔记本电脑我已经购买了20台戴尔笔记本电脑。但是现在我想将我的tblPurchase更新为10。这意味着我不需要20台戴尔笔记本电脑。在那里,我退回了10件物品。现在我的tblProductStock桌子Quantity应该是5。因为我已经卖了5台戴尔笔记本电脑。

另一个问题是,如果我的tblPurchase桌子和tblProductStock桌子数量是这样的:TblPurchase戴尔笔记本电脑数量是20,而戴尔笔记本电脑数量tblProductStock是20。

此时,我从tblPurchase表格中退回10个我不想扣除的项目tblProductStock现在我只想更新tblProductStock到10

如何同时使用这两个更新查询?这是我的两个表,我添加了相同的数据。

tblPurchase

    PurchaseId | ItemCode | ItemName       | Quantity |
    ---------------------------------------------------
    1          | ITM003   |  Dell Laptop   |    5     |
    2          | ITM002   |  Samsung Phone |    2     |
    3          | ITM003   |  Dell Laptop   |    5     |

tblProductStock

   ItemCode | ItemName       | Quantity |
   -------------------------------------
   ITM003   | Dell Laptop    | 10       |
   ITM002   | Samsung Phone  | 2        |

我使用此触发器来解决此问题。但是两个Update语句都可以工作,但不能同时工作。如果一条更新语句删除。另一个工作良好。。能否请您向我发送正确的查询,以更新我的购买和库存表。触发器或存储过程都可以。如果您发送存储过程,请也向我发送C#代码。

我使用了此触发器(我突出显示了IF AND ELSE语句。但是我不知道如何使用它。我只突出显示了它)

ALTER TRIGGER [dbo].[trig_update_productStock_when_change_the_tblProductColumn] 
ON [dbo].[tblPurchase]
AFTER UPDATE
AS
IF EXISTS (SELECT p.ItemCode, ps.ItemCode, SUM(p.Quantity)PurchaseQuantity, MAX(ps.Quantity)ProductStockQuantity FROM tblPurchase p, tblProductStock ps 
Where p.Quantity != ps.Quantity GROUP BY p.itemCode, ps.ItemCode)
BEGIN  
    SELECT MAX(ItemName) ItemName,
    ItemCode,
    SUM(Quantity) Quantity  
    FROM tblPurchase
    GROUP BY itemCode;

    UPDATE ps
    SET Quantity = i.quantity
    FROM tblProductStock ps JOIN
         (SELECT i.ItemCode, SUM(quantity) as quantity
          FROM tblPurchase i
          GROUP BY i.itemCode
         ) i
         ON ps.ItemCode = i.ItemCode;
END
ELSE
BEGIN  
    SELECT MAX(ItemName) ItemName,
    ItemCode,
    SUM(Quantity) Quantity  
    FROM tblPurchase
    GROUP BY itemCode;

    UPDATE ps
    SET Quantity = ps.Quantity - i.quantity
    FROM tblProductStock ps JOIN
         (SELECT i.ItemCode, SUM(quantity) as quantity
          FROM tblPurchase i
          GROUP BY i.itemCode
         ) i
         ON ps.ItemCode = i.ItemCode;
END

请帮我解决这个问题。我正在使用SQL Server 2014

达维·拉奇科(DávidLaczkó)

根据注释中的讨论,您需要涵盖以下情况(使用trigger或sp):

  1. 插入销售
  2. 销售中的更新(类似的更正,如果发生的话,与购买一样)
  3. 在购买时插入(类似于发生新的销售,发生新的购买)
  4. 购买更新

可能的设计:

  1. 可以通过SALES表上的触发程序来推导库存
  2. 可以使用SALES表上的触发器来处理,该触发器使用旧数量-新数量来推导STOCK(因为它可能是负数,所以推导实际上会增加)
  3. 可以通过增加STOCK的PURCHASE表上的触发器来处理
  4. 可以使用PURCHASE表上的触发器来处理,该触发器用旧数量(新数量)推导STOCK(因为它可能是负数,所以推导实际上会增加)

我会将它们全部放在单独的触发器中,因此所有都只有一个更新。
由于这个问题下的讨论已经很长时间了,我认为您应该考虑基于此问题进行实施,并在遇到困难时提出新的问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何创建触发器以使用更新语句调用过程

来自分类Dev

如何在SQL中使用更新语句来连接两个整数值

来自分类Dev

如何在触发器函数的plpgsql过程中使用多个别名?

来自分类Dev

如何在触发器调用的过程中使用COMMIT

来自分类Dev

在包含更新语句和CTE的存储过程中使用Begin tran

来自分类Dev

如何在包含两个表之间的INNER JOIN的SELECT存储过程中使用Dapper?

来自分类Dev

如何在SQLServer存储过程中使用case语句

来自分类Dev

如何在触发器功能或条件中获取更新语句

来自分类Dev

使用存储过程中的值更新触发器中的表

来自分类Dev

如何在Postgres中使用“ for语句”触发器?

来自分类Dev

如何在MYSQL触发器中使用IF语句?

来自分类Dev

如何在SQL中使用触发器更新基于另外两行的行

来自分类Dev

Oracle-如何在两个表之间使用“插入后”触发器?

来自分类Dev

存储过程中受约束的更新语句

来自分类Dev

如何在一个查询中创建两个更新语句?

来自分类Dev

如何在SQL Server 2008中的单个存储过程中编写两个更新查询

来自分类Dev

如何在两个表上一个接一个地编写更新触发器

来自分类Dev

使用 JOIN 两个表的 SQLLite 更新语句

来自分类Dev

如何使用链接服务器从SQL Server 2008 R2存储过程中执行两个Oracle存储过程

来自分类Dev

如何在存储过程中使用多个select语句作为Resultset中的列

来自分类Dev

如何在SQLDataAdapter中使用更新语句

来自分类Dev

如何在SQLDataAdapter中使用更新语句

来自分类Dev

如何在Android中使用更新语句

来自分类Dev

如何在SQL的过程中使用select语句

来自分类Dev

如何在Shell脚本中使用两个“ for语句”?

来自分类Dev

如何在sql触发器中使用插入语句中的变量

来自分类Dev

如何在存储过程中使用插入/删除表?

来自分类Dev

如何在SQL Server存储过程中使用if / else

来自分类Dev

如何在日期时间存储过程中使用BETWEEN

Related 相关文章

  1. 1

    如何创建触发器以使用更新语句调用过程

  2. 2

    如何在SQL中使用更新语句来连接两个整数值

  3. 3

    如何在触发器函数的plpgsql过程中使用多个别名?

  4. 4

    如何在触发器调用的过程中使用COMMIT

  5. 5

    在包含更新语句和CTE的存储过程中使用Begin tran

  6. 6

    如何在包含两个表之间的INNER JOIN的SELECT存储过程中使用Dapper?

  7. 7

    如何在SQLServer存储过程中使用case语句

  8. 8

    如何在触发器功能或条件中获取更新语句

  9. 9

    使用存储过程中的值更新触发器中的表

  10. 10

    如何在Postgres中使用“ for语句”触发器?

  11. 11

    如何在MYSQL触发器中使用IF语句?

  12. 12

    如何在SQL中使用触发器更新基于另外两行的行

  13. 13

    Oracle-如何在两个表之间使用“插入后”触发器?

  14. 14

    存储过程中受约束的更新语句

  15. 15

    如何在一个查询中创建两个更新语句?

  16. 16

    如何在SQL Server 2008中的单个存储过程中编写两个更新查询

  17. 17

    如何在两个表上一个接一个地编写更新触发器

  18. 18

    使用 JOIN 两个表的 SQLLite 更新语句

  19. 19

    如何使用链接服务器从SQL Server 2008 R2存储过程中执行两个Oracle存储过程

  20. 20

    如何在存储过程中使用多个select语句作为Resultset中的列

  21. 21

    如何在SQLDataAdapter中使用更新语句

  22. 22

    如何在SQLDataAdapter中使用更新语句

  23. 23

    如何在Android中使用更新语句

  24. 24

    如何在SQL的过程中使用select语句

  25. 25

    如何在Shell脚本中使用两个“ for语句”?

  26. 26

    如何在sql触发器中使用插入语句中的变量

  27. 27

    如何在存储过程中使用插入/删除表?

  28. 28

    如何在SQL Server存储过程中使用if / else

  29. 29

    如何在日期时间存储过程中使用BETWEEN

热门标签

归档