我创建了使用Microsoft SQL Server 2014餐厅的清单。
我想写每当我插入新的订单到orderDetail
表的触发器,从库存表就会自动更新outStock
为orderDetail.quantity
,并基于该匹配stockLeft
表中以前stockLeft
的product_ID
。
我很新的SQL服务器。任何意见/建议是对我很有帮助。谢谢!!
下面是我的表数据库
这是我到目前为止已经试过
USE [BuffaloWildWingsDB]
GO
CREATE TRIGGER update_stock
ON orderDetail
AFTER INSERT
AS
BEGIN
DECLARE @stock INT,@productID INT, @prevDate date, @prevStock INT;
SET @stock = (SELECT quantity FROM orderDetail)
SET @productID = (SELECT product_ID FROM orderDetail)
SET @prevDate = (SELECT [date] FROM inventory WHERE inventory.product_ID = @productID AND [date] < GETDATE())
SET @prevStock = (SELECT stockLeft FROM inventory WHERE [date] = @prevDate)
INSERT INTO inventory (product_ID, outStock, stockLeft) VALUES (@productID,@stock,@prevStock-@stock);
END
我可以运行此查询不错,但每当我更新orderDetail
与
INSERT INTO orderDetail(order_ID,product_ID, quantity) values (10101, 1013, 2)
GO
我得到这个错误
消息512,级别16,状态1,过程update_stock,第14行子查询返回多个值。这是当子查询如下=,!=,<,<=,>,> =,或当子查询用作表达不允许的。该语句已终止。
任何想法?
您的触发器将仅适用于仅单独的插入工作。如果您将插入一次会失败几行。另外你是从基表,而不是INSERTED
表中选择。这里是你的触发器应该是什么样子:
insert into inventory (product_id, outStock, stockLeft)
select i.product_id, i.quantity, isnull(oa.stockLeft, 0) - i.quantity
from inserted i
outer apply(select top 1 stockLeft
from inventory
where product_id = i.product_id and [date] < GETDATE()
order by [date] desc)oa