![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
INSERT в MSSQL [D7, MSSQL]
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]Только после