Я преобразовываю проект ColdFusion из Oracle 11 в MS SQL 2008. Я использовал SSMA для преобразования БД, включая триггеры, процедуры и функции.Последовательности были сопоставлены со столбцами IDENTITY.
Я планировал использовать INSERT-операторы, такие как
INSERT INTO mytable (col1, col2)
OUTPUT INSERTED.my_id
values('val1', 'val2')
Это выдает ошибку, поскольку в таблице определен триггер, и AFTER INSERT записывает некоторые из INSERTED.данные в другую таблицу для хранения истории данных.
Microsoft пишет:
Если указано условие OUTPUT без указания ключевого слова INTO, цель операции DML не можетиметь любой включенный триггер, определенный для него для данного действия DML.Например, если предложение OUTPUT определено в операторе UPDATE, в целевой таблице не должно быть никаких включенных триггеров UPDATE.http://msdn.microsoft.com/en-us/library/ms177564.aspx
Теперь мне интересно, как лучше всего сначала получить сгенерированный идентификатор, а затем «сделать резервную копию» ВСТАВЛЕННЫХ данных во второй таблице.
хороший подход для вставки?Это работает, потому что значение INSERTED не просто возвращается, а записывается во временную переменную.Это работает в моих тестах, как описывает Microsoft, не выдавая ошибку относительно триггера.
<cfquery>
DECLARE @tab table(id int);
INSERT INTO mytable (col1, col2)
OUTPUT INSERTED.my_id INTO @tab
values('val1', 'val2');
SELECT id FROM @tab;
</cfquery>
Должен ли я вообще использовать предложение OUTPUT?Когда мне нужно написать несколько предложений в одном блоке cfquery, не лучше ли мне использовать SELECT SCOPE_DENTITY ()?
Спасибо и наилучшим образом, Бернхард