【问题标题】:SQL Server checking inventory stock on insertSQL Server 在插入时检查库存
【发布时间】:2015-11-28 07:48:16
【问题描述】:

我正在使用 Microsoft SQL Server 2014 为餐厅创建库存。

这是diagram from 5 tables

我想为每当我将新订单插入orderDetail 表时编写一个触发器,库存中的表将自动更新outStockorderDetail.quantitystockLeft 基于表中先前的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

我收到了这个错误

消息 512,级别 16,状态 1,过程 update_stock,第 14 行子查询 返回超过 1 个值。子查询时不允许这样做 遵循 =、!=、、>= 或当子查询用作 表达。声明已终止。

有什么想法吗?

【问题讨论】:

  • 我更新了问题。我不知道如何创建一个 FUNCTION 来检查上一个日期相同 product_ID 的值。任何帮助将不胜感激。

标签: sql-server database triggers


【解决方案1】:

您的触发器仅适用于单独的插入。如果您一次插入几行,它将失败。此外,您正在从基表而不是 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

【讨论】:

  • @DucTruong,如果它回答了你的问题,为什么不接受?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 2020-08-16
  • 1970-01-01
  • 2023-03-16
相关资源
最近更新 更多