2015-11-28 2 views
-3

Я создаю инвентарь для ресторана с помощью Microsoft SQL Server 2014. СерверSQL проверки инвентаризации запасов на вставке

Это diagram from 5 tables

Я хочу написать триггер для всякий раз, когда я ввожу новый порядок в orderDetail таблица, таблица из инвентаря автоматически обновит как 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,@[email protected]); 
END 

я могу запустить этот штраф запрос, но всякий раз, когда я обновляю orderDetail с

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

Я получил эту ошибку Msg 512, уровень 16, состояние 1, процедура update_stock, строка 14 Подзапрос возвратил более 1 значения. Это недопустимо, когда подзапрос следует =,! =, <, < =,>,> = или когда подзапрос используется как выражение. Заявление было прекращено. Любая идея?

+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, почему бы не принять ответ, если он отвечает на ваш вопрос? –

Смежные вопросы