SQL Server 2008 - помощь в создании простого запуска INSERT
Это с Microsoft SQL Server 2008.
У меня есть 2 таблицы, Employee и EmployeeResult, и я пытаюсь написать простой триггер INSERT на EmployeeResult, который делает это - каждый раз, когда INSERT выполняется в EmployeeResult, например:
(Джек, 200, Продажи)
(Джейн, 300, маркетинг)
(John, 400, Engineering)
Он должен искать парные имена Name, такие как
(Джек, Продажи),
(Джейн, Маркетинг),
(Джон, Инжиниринг)
в таблице Employee, и если такой сотрудник не существует, следует вставить его в таблицу Employee.
У меня есть это с неизвестными о том, как исправить "???" s:
CREATE TRIGGER trig_Update_Employee
ON [EmployeeResult]
FOR INSERT
AS
IF EXISTS (SELECT COUNT(*) FROM Employee WHERE ???)
BEGIN
INSERT INTO [Employee] (Name, Department) VALUES (???, ???)
END
Пожалуйста, помогите, спасибо заранее
Схема:
Employee
--------
Name, varchar(50)
Department, varchar (50)
EmployeeResult
--------------
Name, varchar(50)
Salary, int
Department, varchar (50)
Ответы
Ответ 1
Вы хотите воспользоваться логической таблицей вставленной, доступной в контексте триггера. Он соответствует схеме для таблицы, которая вставлена в и включает строки (строки), которые будут вставлены (в триггере обновления у вас есть доступ к вставленным и удаленным логические таблицы, которые представляют собой новые и исходные данные соответственно.)
Итак, чтобы вставить пары Employee/Department, которые в настоящее время не существуют, вы можете попробовать что-то вроде следующего.
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
Ответ 2
cmsjr имеет правильное решение. Я просто хотел указать на пару вещей для вашего будущего развития триггера. Если вы используете инструкцию значений в вставке в триггере, существует острая вероятность того, что вы поступаете неправильно. Триггеры запускаются один раз для каждой партии записей, вставленных, удаленных или обновленных. Поэтому, если десять записей были вставлены в одну партию, триггер срабатывает один раз. Если вы ссылаетесь на данные в вставленных или удаленных и используя переменные и предложение values, вы будете получать данные только для одной из этих записей. Это вызывает проблемы с целостностью данных. Вы можете исправить это, используя встроенную вставку в виде cmsjr, показанной выше, или с помощью курсора. Никогда не выбирайте путь курсора. Курсор в триггере - это проблема, ожидающая, когда она будет медленной, и может задержать чат в часах. Я удалил курсор из триггера один раз и улучшил процесс импорта с 40 минут до 45 секунд.
Вы можете подумать, что никто не собирается добавлять несколько записей, но это происходит чаще, чем большинство людей, не использующих базу данных. Не пишите триггер, который не будет работать при всех возможных условиях вставки, обновления, удаления. Никто не будет использовать метод одной записи в то время, когда им нужно импортировать 1 000 000 целевых записей для продажи от нового клиента или обновить все цены на 10% или удалить все записи от поставщика, чьи продукты вы больше не продаете.
Ответ 3
проверьте этот код:
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