问题描述
我有一个学校项目,用于控制库存。我正在尝试使用基于2个相关表的触发器来更新表中的多行。
所以 我有以下3张桌子
通过使用 StockIn_detail 上的触发事件获取 Products_stock 表中的更新数据
,效果很好插入数据时触发:
CREATE TRIGGER [StockIn_InsertTrigger]
ON [dbo].[StockIn_Detail]
FOR INSERT
AS
DECLARE @AmountIn int
DECLARE @WH_ID int
Select @AmountIn=Amount from Inserted
where ProID=(Select ProID from inserted)
-- Base on warehouse
select @WH_ID = wh_id from StockIn where InID = (select InID from inserted)
BEGIN
Update Products_stock set Qty_on_hand = Qty_on_hand + @AmountIn where product_id = (Select ProID from inserted)
and warehouse_id = @WH_ID
END
但是要更新 StockIn 表中的数据。例如,当我想将仓库(wh_id)更改为其他仓库时。在这种情况下,我必须通过减去旧仓库中产品的手工数量来更新 Products_stock 表,然后将其重新添加到新仓库中。因为我的英语不好,所以很难解释,所以这是我在 StockIn 触发器更新事件中尝试过但失败的代码:
CREATE TRIGGER [UpdateWHStockIn]
ON [dbo].[StockIn]
FOR UPDATE
AS
DECLARE @OldWH int,@NewWH int,@TID nvarchar(50)
SELECT @TID = InID FROM deleted
SELECT @OldWH = wh_id FROM deleted
SELECT @NewWH = wh_id FROM inserted
DECLARE @InTbl table (ProductID nvarchar(5),Amount int,OldWH int,NewWH int)
INSERT INTO @InTbl (ProductID,Amount)
SELECT ProID,Amount FROM StockIn_Detail WHERE StockIn_Detail.InID = @TID
BEGIN
-- Update only when warehouse change
if @OldWH <> @NewWH
begin
-- Subtract stock which use old warehouse id
UPDATE Products_stock
SET Qty_on_hand = Qty_on_hand - (SELECT Amount FROM @InTbl)
WHERE product_id IN (SELECT ProductID FROM @InTbl)
AND warehouse_id = @OldWH
-- add to stock which use new warehouse id
UPDATE Products_stock
SET Qty_on_hand = Qty_on_hand + (SELECT Amount FROM @InTbl)
WHERE product_id IN (SELECT ProductID FROM @InTbl)
AND warehouse_id = @NewWH
end
END
我知道这是由于以错误的方式使用子查询引起的,但是我找不到解决方案,因为我是sql的新手,因为我是一名大学生。如果我使用C#程序可以解决此问题,那么我可以通过循环更好地了解它,声明变量,比较它,并更新eachrow ...但是我认为写这样的循环并在sql server之外创建函数也不是最佳实践。我的顾虑。如果我忘记在每次更新数据时都会发生的触发器不同的地方在c#代码中使用该函数,则可能会导致错误的数据。因此,我不必担心一次又一次地编写它。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)