Показать сообщение отдельно
Старый 29.06.2011, 14:44   #12  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,658 / 1162 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от AndyD Посмотреть сообщение
Для автоинкрементных полей в MS SQL можно воспользоваться вызовом
X++:
select @@identity
после вставки
Угу. Только следует помнить, что @@identity относится к последнему созданному значению в любой таблице

В данном случае, например, если таблица tablex имеет триггер на вставку в котором происходит вставка в связанную таблицу, которая тоже имеет поле со свойством Identity, то в результате @@identity вернет не код записи таблицы tablex, а код записи подчиненной таблицы.

Поэтому в данном конкретном случае лучше использовать функцию SCOPE_IDENTITY(). Примерно так

X++:
stringSQL = " set nocount on;" + "\n" + 
                   " insert into tablex (name) values ('Name3');" + "\n" +
                   " SELECT NewIdent=SCOPE_IDENTITY()" + 
                    "";
rec.open(stringSQL);
Если же используется версия MS SQL 2005 или старше, то есть более строгое решение с использованием опции OUTPUT

X++:
stringSQL = " set nocount on;" + "\n" + 
                   " declare @retVal table(f1 integer)"
                   " insert into tablex (name) output inserted.f1 into @retVal values ('Name3');" + "\n" +
                   " SELECT f1 from @retVal" + 
                    "";
rec.open(stringSQL);
В данном случае я предполагаю, что таблица имеет поле f1 типа integer со свойством identity

Другими словами, одной команды INSERT явно не достаточно. Нужно либо писать процедуру, либо посылать повторный запрос для поиска только что вставленной записи. Что для Вас проще и привычнее, то и делайте.