Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

INSERT в MSSQL [D7, MSSQL]


Страницы:   1 2 3 4

ST ©   (2005-04-28 12:23:00) 

Господа, подскажите, можно ли при выполнении INSERT на MSSQL 2000 вытащить полученный автоинкрементом новый индекс записи в одном запросе.


ANB   (2005-04-28 15:40:00) [61]


> msguns ©   (28.04.05 13:06) [7]
- читай топик ("до" не надо, нужен аналог ретурнинг Oracle).


> Таким образом можно "обмануть" SQL-Server,
- не надо его обманывать. В нем есть штатные функции для этих целей. А это изгал.


Anatoly Podgoretsky   (2005-04-28 13:11:00) [62]

mariya_mezenceva ©   (28.04.05 12:58) [4]
прекрасно работаешь над разрушением логической целостности базы.


msguns   (2005-04-28 13:06:00) [63]

Есть такой немудреный способ:
1. Создается таблица со структурой (#AUTOID)
 TableName  VARCHAR
 CURID      INTEGER
2. Содается ХП, которая делает так
- Блокирует таблицу
- считывает значение CURID из этой таблицы из соотв.записи
- Значение = Значение + 1
- UPDATE счетчику в таблице на Значение
- Разблокирует таблицу
- Возвращает Значение
3. На каждую таблицу БД, где надо счетчик, создается триггер, срабатывающий ДО вставки. Это триггер проверяет значение ID и, если оно NULL, то обращается к указанной процедуре за значением счетчика

В результате ID можно получить на клиенте БЕЗ вставки (точнее ДО). Таким образом можно "обмануть" SQL-Server, "подменив" его фукцию автоинкремента.

Других эффиективных способов получения уникального ID ДО вставки я не знаю, хотя весьма интересовался этой проблемой. В т.ч. и на этом форуме.


ANB   (2005-04-28 13:03:00) [64]

IDENT_CURRENT - вернет текущее значение ID, и не факт, что твое, если с таблицей работают часто.


ANB   (2005-04-28 13:01:00) [65]

insert into table1 (A,B,C) values ('A', 'B', 'C')
select @@identity as NEW_ID

Все это надо засунуть в одну кверю и выполнять не Execute, а Open. После открытия можно будет прочитать в FieldByName('NEW_ID') добавленный ID. Другие способы некорректны.


mariya_mezenceva   (2005-04-28 12:58:00) [66]

прекрасно работает
я всегда делаю так
(реализую в хранимой процедуре)
CREATE PROCEDURE pinstable_name
@f varchar(10),
...,
@id int output
AS
insert into table_name(f,...) values (@f,...)
select @id=IDENT_CURRENT('table_name')


Anatoly Podgoretsky   (2005-04-28 12:50:00) [67]

Только не это, рекомендую прочить справку прежде чем подобное советовать.


mariya_mezenceva   (2005-04-28 12:33:00) [68]

select IDENT_CURRENT('table_name')


Anatoly Podgoretsky   (2005-04-28 12:24:00) [69]

Только после


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо