Я конвертирую проект ColdFusion из Oracle 11 в MS SQL 2008. Я использовал SSMA для преобразования БД, включая триггеры, процедуры и функции. Последовательности были сопоставлены столбцам IDENTITY.Извлечь сгенерированный идентификатор в MS SQL 2008
Я планировал использовать Вставки-заявление как
INSERT INTO mytable (col1, col2)
OUTPUT INSERTED.my_id
values('val1', 'val2')
Это выдает ошибку, поскольку таблица имеет триггер, определенные, что ПОСЛЕ INSERT записывает некоторые из вставленных данных в другую таблицу, чтобы сохранить историю данных ,
Microsoft пишет:
Если предложение OUTPUT указано без указания также INTO ключевого слова, цель операции DML не может иметь какой-либо включена триггера, определенный на нем для данного действия DML. Например, если предложение OUTBUTопределено в инструкции UPDATE, то в целевой таблице не может быть активированных триггеров UPDATE. http://msdn.microsoft.com/en-us/library/ms177564.aspx
Я теперь интересно, что это лучшая практика Ф.О. во-первых, получить сгенерированный идентификатор и во-вторых, «резервное копирование» вставленного данных во второй таблице.
Является ли это хорошим подходом для INSERT? Он работает, потому что значение INSERTED не просто возвращается, а записывается в временную переменную INTO. Он работает в моих тестах, как описывает 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()?
Спасибо и лучше, Бернхард
Что вам нужно делать с '@ tab' после вставки? Просто верните «ID» в CF? Вы пытались использовать 'SCOPE_IDENTITY()' вместо 'OUTPUT'? Пробовали ли вы использовать хранимую процедуру, чтобы сделать то же самое, вместо того, чтобы набивать ad hoc SQL в 'cfquery'? –
Я не использую @tab для большего, чем возврат сгенерированного идентификатора. Я не хочу много кода/для многих операторов в одном блоке CFQUERY. Если я использую 'SCOPE_IDENTITY', мне больше не нужны' DECLARE' и 'OUTPUT'. Если бы у меня была процедура, мне все равно пришлось извлекать сгенерированный идентификатор, не отключая триггер. Поэтому я предполагаю 'SELECT SCOPE_DENTITY()' это. –
@Bardware - Моим первым вопросом было бы попытаться использовать атрибут ccquery ['result'] (http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7fae.html) и' result. Вместо переменной IDENTITYCOL? cfquery использует SCOPE_IDENTITY внутренне последнее, что я проверил. – Leigh