Вы хотите воспользоваться преимуществами вставленной логической таблицы , которая доступна в контексте триггера. Он соответствует схеме для таблицы, в которую вставляется, и включает строку (строки), которые будут вставлены (в триггере обновления у вас есть доступ к вставленным и удаленным логическим таблицам. которые представляют новые и исходные данные соответственно.)
Итак, чтобы вставить пары Сотрудник / Отдел, которые в настоящее время не существуют, вы можете попробовать что-то вроде следующего.
CREATE TRIGGER trig_Update_Employee
ON [EmployeeResult]
FOR INSERT
AS
Begin
Insert into Employee (Name, Department)
Select Distinct i.Name, i.Department
from Inserted i
Left Join Employee e
on i.Name = e.Name and i.Department = e.Department
where e.Name is null
End
cmsjr нашел правильное решение. Я просто хотел указать на пару моментов для вашего будущего развития триггера. Если вы используете оператор values во вставке в триггер, существует большая вероятность того, что вы делаете неправильные вещи. Триггеры срабатывают один раз для каждого пакета вставленных, удаленных или обновленных записей. Таким образом, если десять записей были вставлены в один пакет, то триггер срабатывает один раз. Если вы ссылаетесь на данные во вставленных или удаленных и используете переменные и предложение значений, то вы получите данные только для одной из этих записей. Это вызывает проблемы с целостностью данных. Вы можете исправить это, используя вставку на основе набора, как показано в cmsjr выше, или с помощью курсора. Никогда не выбирайте путь курсора. Курсор в триггере - это ожидающая своего появления проблема, поскольку они медленные и могут заблокировать вашу таблицу на несколько часов. Я удалил курсор из триггера один раз и улучшил процесс импорта с 40 минут до 45 секунд.
Вы можете подумать, что никто никогда не собирается добавлять несколько записей, но это происходит чаще, чем думает большинство людей, не связанных с базами данных. Не пишите триггер, который не будет работать при всех возможных условиях вставки, обновления и удаления. Никто не будет использовать метод одной записи за раз, когда им нужно импортировать 1000000 записей о целевых продажах от нового клиента или обновить все цены на 10% или удалить все записи у поставщика, продукты которого вы больше не продаете.
Вы можете подумать, что никто никогда не собирается добавлять несколько записей, но это происходит чаще, чем думает большинство людей, не использующих базы данных. Не пишите триггер, который не будет работать при всех возможных условиях вставки, обновления и удаления. Никто не будет использовать метод одной записи за раз, когда ему нужно импортировать 1000000 записей о продажах от нового клиента или обновить все цены на 10% или удалить все записи у поставщика, продукты которого вы больше не продаете.
Вы можете подумать, что никто никогда не собирается добавлять несколько записей, но это происходит чаще, чем думает большинство людей, не использующих базы данных. Не пишите триггер, который не будет работать при всех возможных условиях вставки, обновления и удаления. Никто не будет использовать метод одной записи за раз, когда ему нужно импортировать 1000000 записей о продажах от нового клиента или обновить все цены на 10% или удалить все записи у поставщика, продукты которого вы больше не продаете.
000 целевых записей продаж от нового клиента, или обновить все цены на 10%, или удалить все записи от поставщика, продукты которого вы больше не продаете. 000 целевых записей продаж от нового клиента или обновить все цены на 10% или удалить все записи от поставщика, продукты которого вы больше не продаете.