2016-05-11 3 views
1

Извините заранее за мой английский, вот проблема: как я не могу думать о логике триггера, в нижней строке, что есть 2 таблицы:триггер Update, добавьте не работает должным образом

  • список материалов
  • прибытие Журнал

при добавлении записей в таблицу в журнале прихода действует триггер, который проверяет, если таблица пуста добавить новую запись (материал, количество на складе), если в таблице есть записи, обновите их при условии, что Material = (select the part Name From inserted), но если в таблице есть записи и Material != select the part Name From inserted), то добавьте новую запись.

Вот код триггера:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER Trigger [dbo].[Application Log Sheet] 
ON [dbo].[Parish magazine] 
FOR INSERT 
AS 
    DECLARE @a INT; 
    DECLARE @b int; 

    SELECT @a = COUNT(*) 
    FROM Bill of materials 

    IF @a > 0 
    BEGIN 
     UPDATE Vedomostithe 
     SET Kolichestvennogo = the Number of stock + (select Quantity from inserted) 
     WHERE Material = (select the part Name from inserted) 
    END 
    ELSE IF @a >= 0 
     INSERT INTO Bill of material(Material, Quantity in stock) 
      SELECT the part Name, Number 
      FROM the arrival Journal 
      WHERE [ID] IN (SELECT [ID] FROM inserted) 

Таблица спецификация:

create table Bill of materials 
(
    ID int primary key, 
    Material nvarchar(max), 
    Quantity in stock int 
) 

Таблица прибытия журнала:

create table Journal of the parish 
(
    ID int primary key, 
    Part name nvarchar(max), 
    The number of int 
) 
+0

Какую версию SQL Server вы используете? –

+0

У меня есть версия sql Server 2016 –

ответ

1

С одной стороны, вы не должны» t магазин данные, которые могут быть рассчитано, так как все, что это делает, дает вам возможность, чтобы хранимый расчет был несовместим с остальными данными. Таким образом, я обычно рекомендую просто иметь представление, которое показывает итоговые значения.

С другой стороны, это выглядит как простая задача для MERGE. Но мы должны иметь в виду, что inserted может содержать несколько строк, и они могут быть для нескольких разных частей. Итак, мы хотим что-то вроде:

ALTER Trigger [dbo].[Application Log Sheet] 
ON [dbo].[Parish magazine] 
for insert 
AS 

MERGE INTO [Bill of Materials] t 
USING (SELECT PART, SUM(Quantity) as Qty from inserted group by PART) s 
ON t.Part = s.Part 
WHEN MATCHED THEN UPDATE SET Quantity = t.Quantity + s.Qty 
WHEN NOT MATCHED THEN INSERT (Part,Quantity) VALUES (s.Part,s.Qty) 

Извинения, если некоторые имена неправильны выше, но, надеюсь, вы можете увидеть, как адаптировать его в соответствии с вашими требованиями (вам вопросы, кажется, флип-флоп между различными таблицы/колонки такие имена, что, кажется, около четырех разных имен таблиц, тогда как вы начинаете свой вопрос, говоря, что есть два).

+0

Спасибо большое! Теперь я знаю о MERGE! –

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