我正在使用Microsoft SQL Server 2014为餐馆创建广告资源。
我想在每次向orderDetail
表中插入新订单时编写触发器,来自广告资源的表格会自动将outStock
更新为orderDetail.quantity
和基于stockLeft
在表格中与stockLeft
匹配的product_ID
上。
我对SQL Server很新。任何意见/建议对我都非常有帮助。谢谢!
以下是
中的表格数据库这是我到目前为止所尝试的
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
我收到了这个错误
Msg 512,Level 16,State 1,Procedure update_stock,Line 14 Subquery 返回超过1的值。子查询时不允许这样做 follow =,!=,&lt;,&lt; =,&gt;,&gt; =或者当子查询用作 表达。声明已经终止。
有什么想法吗?
答案 0 :(得分:0)
您的触发器仅适用于单独的插入。如果要一次插入多行,则会失败。您也从基表而不是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