SQL Server检查插入

时间:2015-11-28 07:48:16

标签: sql-server database triggers

我正在使用Microsoft SQL Server 2014为餐馆创建广告资源。

这是diagram from 5 tables

我想在每次向orderDetail表中插入新订单时编写触发器,来自广告资源的表格会自动将outStock更新为orderDetail.quantity和基于stockLeft在表格中与stockLeft匹配的product_ID上。

我对SQL Server很新。任何意见/建议对我都非常有帮助。谢谢!

以下是

中的表格数据库

inventory and orderDetail

这是我到目前为止所尝试的

    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; =或者当子查询用作   表达。声明已经终止。

有什么想法吗?

1 个答案:

答案 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