2014-10-15 3 views
0

У меня есть следующий код (в sql-сервере - через 2012): я не могу понять, что это правильно. какие-либо предложения.SQL Trigger не работает после обновления

Таблица:

select top 1000 [supplier], 
       [item], 
       [reorder_level], 
       [current_inventory], 
       [reorder], 
from [clinic].[dbo].[emr_suppliers] 

Я работаю на спусковой крючок и немного застрял.

CREATE TRIGGER reorder_supplies 
ON emr_suppliers 
After insert, update 
As BEGIN 

update emr_suppliers 
set reorder = 'yes' 
where (emr_suppliers.reorder = emr_suppliers.current_inventory or emr_suppliers.reorder > emr_suppliers.current_inventory) 

update emr_suppliers 
set reorder = 'no' 
where emr_suppliers.reorder < emr_suppliers.current_inventory 

END 

Что триггер должен сделать, это сравнить текущую инвентаризацию с колонками Reorder уровня, и если значение текущей инвентаризации, равно или меньше, чем уровень REORDER, это поставит значение Да в столбец «Переупорядочить», а если это не так, то вместо него вместо этого будет помещено значение «Нет».

+1

Где вы застряли? Вы получаете сообщение об ошибке? неожиданные результаты? –

+0

Ошибка: неполный SQL: CREATE TRIGGER reorder_supplies – YelizavetaYR

+0

Код, который вы показываете выше, не должен приводить к неполной ошибке sql. Вы уверены, что выполняете именно этот код? –

ответ

1

Триггер сам по себе выглядит синтаксически правильным. Однако я не думаю, что это решение с достойной производительностью, так как каждая строка таблицы emr_suppliers затрагивается дважды, даже несмотря на то, что для большинства строк вообще не было изменений данных (например, после вставки новой строки или обновление одного значения).

Я хотел бы использовать решение, основанное на внутренней вставленной таблицы вместе с выражением CASE-:

UPDATE emr_suppliers 
SET reorder = 
    CASE WHEN emr_suppliers.reorder < emr_suppliers.current_inventory THEN 'no' 
     WHEN emr_suppliers.reorder >= emr_suppliers.current_inventory THEN 'yes' 
    ELSE reorder -- don't change the value 
    END 
FROM emr_suppliers INNER JOIN inserted ON emr_suppliers.primary_key = inserted.primary_key 
Смежные вопросы