2015-11-28 149 views
-3

我創建使用Microsoft SQL Server的一個餐廳的庫存檢查庫存現貨2014SQL Server上插入

這是diagram from 5 tables

我想寫每當我插入新的訂單到orderDetail觸發表中,來自庫存的表格將自動更新outStock作爲orderDetail.quantitystockLeft,基於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,@[email protected]); 
END 

我可以運行此查詢不錯,但每當我更新orderDetail

INSERT INTO orderDetail(order_ID,product_ID, quantity) values (10101, 1013, 2) 
GO 

我得到這個錯誤 消息512,級別16,狀態1,過程update_stock,行14 子查詢返回多個值。當子查詢遵循=,!=,<,< =,>,> =或當子查詢用作表達式時,這是不允許的。 該聲明已被終止。 有什麼想法?

+0

我更新了問題。我不知道如何使用FUNCTION來檢查之前日期中相同product_ID的值。任何幫助將非常感激。 –

回答

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 
+0

非常感謝你,它的工作 –

+0

@DucTruong,如果它回答你的問題,爲什麼不接受答案? –