2012-03-13 2 views
-3
Table1 contains id(Auto PK), Key(Varchar) & Value(Int) 
Table2 contains Key(Varchar), postive_sum(Int), negative_sum(Int) 

Нам нужно написать триггер всякий раз, когда вставляется новая строка в Table1Состояние комплекс в Trigger Database

  • Он должен сравнить вновь вставленный значение (newRow.Table1.Value) с предыдущим значением (oldRow.Table1.Value) для того же ключа

  • Если он больше, поле positive_sum tABLE2 имеет обновляться путем добавления новых вставленного значения (newRow.Table1.Value) с существующим значением

  • Если это меньшее, поле negative_sum table2 имеет быть обновлено путем добавления вновь вставленное значения (newRow.Table1.Value) с существующим значением

  • Если клавиша на table2 не существует, соответствующая запись должен быть создан

мы попытались с требуемыми логик, но мы не хватает на создании такой же в MS SQL Server 2008.

Все входы были бы оценены.

+0

Таким образом, делает «ключ» уже существует на 'Table2' ?, или вы должны сначала проверить, что на существовании таблицы, чтобы сделать' INSERT', а затем в 'UPDATE'? – Lamak

+0

Какую часть вы не понимаете, или вы просто ожидаете, что кто-то напишет вам полный триггер? – JeffO

ответ

0

Примечание: поскольку может быть больше записей Table1, обновляемых в то же время с одним и тем же ключом, необходимо суммировать различия, помещая только суммарный вес в положительные и отрицательные сводные поля. Попытка сделать это без суммирования завершится неудачей, потому что будет записана только последняя строка с одним и тем же ключом, а остальные будут отброшены.

alter trigger theTrigger on Table1 
after update, insert 
as 
    set NoCount ON 

    if update(Value) 
    begin 
     -- Add missing records to summary table 
     insert into table2 (Key, positive_sum, negative_sum) 
     select distinct Key, 0, 0 
      from Inserted 
      where not exists (select null from table2 t2 where t2.Key = Inserted.Key) 
     -- Update summary 
     update table2 
      set Positive_sum = isnull(positive_sum, 0) + isnull (diff.Positives, 0), 
       Negative_sum = isnull(Negative_sum, 0) + isnull (diff.Negatives, 0) 
      from table2 
     -- One can have only one record per key because otherwise sums would not be correct. 
      inner join (select Inserted.Key, 
          sum (case when Inserted.Value > isnull(Deleted.Value, 0) then Inserted.Value - isnull(Deleted.Value, 0) end) Positives, 
          sum (case when Inserted.Value < isnull(Deleted.Value, 0) then isnull(Deleted.Value, 0) - Inserted.Value end) Negatives, 
         from Inserted 
           left join Deleted on Inserted.ID = Deleted.ID 
         group by Inserted.Key 
         ) diff 
      on table2.Key = diff.Key 

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