Оператор слияния для таблицы с триггером в SQL Server 2008 - PullRequest
0 голосов
/ 21 июня 2011

Я новичок в SQL Server 2008, согласно требованию мы должны были использовать инструкцию MERGE для обновления / вставки строк в таблицу назначения на основе определенного условия.

проблема в том, что целевая таблица имеет триггер для обновления, в котором мы использовали вставленную таблицу следующим образом

select StudentID from Inserted 

когда я запускаю оператор слияния, он вызывает ошибку в триггере, говоря, что подзапрос возвращает несколько строк, это не разрешено.

означает ли это, что триггер срабатывает для всех записей, которые обрабатываются из оператора слияния? Можем ли мы сделать срабатывание триггера для каждой обработанной записи?

Может кто-нибудь, пожалуйста, помогите мне.

спасибо

1 Ответ

1 голос
/ 21 июня 2011

Да, в SQL Server триггеры запускаются один раз за оператор, а не один раз за строку.

Вы не показали нам достаточно своего SQL, чтобы я мог предложить, как переписать ваш триггер. Если это что-то вроде:

UPDATE Table2 set ABC = DEF where ID = (select StudentID from Inserted)

тогда переписать так же просто, как:

UPDATE Table2 set ABC = DEF where ID in (select StudentID from Inserted)

Более сложные запросы потребуют больше работы для их исправления.


Из вашего примера (в настоящее время опубликован как ответ) у вас есть:

if (select studentID from Inserted) <> (select studentId from deleted)

Вместо этого вы можете получить что-то вроде:

if exists(select * from inserted i full outer join deleted d on i.StudentID = d.StudentID where i.StudentID is null or d.StudentID is null)

Который проверяет, что вы можете объединить каждую строку во вставленной строке с удаленной, и наоборот.

Однако, если это ранняя часть вашего триггера, вероятно, есть другие места в коде, которые предполагают только одну строку в inserted и deleted. Все они должны будут измениться.

Чтобы еще раз подчеркнуть мое первое предложение - SQL Server вызывает срабатывание один раз за оператор, а не один раз за строку. Нет способа изменить это, поэтому вы должны изменить свой код, чтобы справиться с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...