![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ID вставляемой записи [D6, MSSQL]
Ярослав © (2005-02-07 18:24:00)Подскажите как узнать идентификатор записи при вставке из Delphi в базу MS SQL, т.е. я вставляю запись и знаю что запись произошла успешно, но как мне ее потом найти, что бы установить на ее курсор в DB Grid
Ega23 (2005-02-10 09:48:00) [1]Если я правильно понял, то чтобы получить ID последней вставленной мною записи, можно выполнить insert и выбрать SCOPE_IDENTITY, и гарантия того, что SCOPE_IDENTITY не изменится с последнего insert'а?
Это только в MS SQL 2000 и выше. В предыдущих версиях этого не было, была только глобальная переменная @@IDENTITY
Anatoly Podgoretsky (2005-02-10 08:50:00) [2]Автоинкриментные поля на то и авто, чтобы их не изменяли руками.
Deniz (2005-02-10 08:08:00) [3]Можно и мне один вопрос прояснить для самообразования?
Если я правильно понял, то чтобы получить ID последней вставленной мноюзаписи, можно выполнить insert и выбрать SCOPE_IDENTITY, и гарантия того, что SCOPE_IDENTITY не изменится с последнего insert'а?
Shirson (2005-02-09 18:25:00) [4]@@Identity и SCOPE_IDENTITY выдают последний id, сгенерированный при работе с ЛЮБОЙ таблицей в базе. Причём @@Identity даёт вообще последний id, в то время как SCOPE_IDENTITY ограничен только текущей scope (Скэуп это любой модуль, как то СП, триггер, функция или бач).
Кстати, при откате, @@Identity НЕ ОТКАТЫВАЕТСЯ. Т.е. если делается транзакция, в @@Identity заносится новый id, а потом идёт rollback, то @@Identity содержит неактуальный id.
Еще есть IDENT_CURRENT. Он ограничен именно одной таблицей, но не ограничен scope или сессией.
Если нужно поймать последний id, сгенерированный для данной таблицы (неважно кем/чем), то юзаем IDENT_CURRENT.
Если нужно поймать последний id, сгенерированный благодаря нашим действиям, в нашем баче, то юзаем SCOPE_IDENTITY.
P.S. Set NoCount ON ставлю во всех SP. Был случай, когда без него результат работы SP неверно воспринималась клиентской частью (или select into погонял?). К сожалению, подробности пронеслись ужасом больше года назад, поэтому точно проблему не упомню. Помню только, что матерился долго и заковыристо :)
Ega23 (2005-02-09 14:44:00) [5]Нет. Точнее, не факт.
Любая вставка в таблицу с identity полем приводит к обновлению глобальной серверной переменной @@IDENTITY.
Если прочитать её значение сразу же после вставки в рамках одной транзакции - то будет всё ОК. Если пытаться читать её разными транзакциями - то леший его знает, что в ней будет.
kivadim (2005-02-09 14:36:00) [6]Query.SQL.Text:='SELECT @@Identity AS NewId';
Query.Open;
будет актуальное значение возвращать, если данные вводились через
серверную процедуру?
Ega23 (2005-02-09 14:11:00) [7]2 Fay © (09.02.05 05:17) [17]
Ega23 © (08.02.05 13:53) [6]
Согласен, Set NoCount ON не повредит, но зачем Set NoCount OFF?
А это уже по-привычке, после BDE... :о)
Johnmen (2005-02-09 14:04:00) [8]>Это что в одном запросе?
Это же АДО.
Ega23 (2005-02-09 13:57:00) [9]Это что в одном запросе?
Да. А почему бы и нет?
kivadim (2005-02-09 13:50:00) [10]to Johnmen
Query.SQL.Text:=
'INSERT INTO ...;
SELECT @@Identity AS NewId';
Query.Open;
Это что в одном запросе?
Fay (2005-02-09 05:17:00) [11]Ega23 © (08.02.05 13:53) [6]
Согласен,Set NoCount ONне повредит, но зачемSet NoCount OFF?
Nikolay M. (2005-02-08 18:09:00) [12]
> Johnmen © (08.02.05 18:06) [15]
> >> А в чём грабли ? (просто интересно...)
>
> Имелись в виду грабли с АДО&MSSQL для [3]
Я лично не наблюдал. Так что мне бы тоже было интересно :)
Johnmen (2005-02-08 18:06:00) [13]>Nikolay M. © (08.02.05 16:30) [13]
>> А в чём грабли ? (просто интересно...)
Имелись в виду грабли с АДО&MSSQL для [3]
Anatoly Podgoretsky (2005-02-08 17:59:00) [14]Кстати как трактовать session и scope при работе с MSSQL через ADO. Относить это к соединению, транзакции или к отдельному запросу?
Nikolay M. (2005-02-08 16:30:00) [15]
> Serggg (08.02.05 15:01) [9]
> У MSSQL есть функция IDENT_CURRENT, выдает текущее значение
> счетчика (т.е. последнее внесенное в базюку).
И на фига ему это?
IDENT_CURRENT returns the last identity value generated for a specific table in anysession and anyscope.
Нужно @@IDENTITY или SCOPE_IDENTITY().
> А в чём грабли ? (просто интересно...)
Имхо, грабли могут быть для БДЕ/ОДБЦ. Например, если в Екселе создать такой запрос для внешних данных:
DECLARE @x
SELECT @x = 123
EXEC dbo.Proc @Param = @х
то без ноукаунта Ексель решит, что результат инициализации @x (сопровождающийся "1 rows affected") будет результатом выполнения ВСЕГО батча и собственно сам резалт-датасет не подхватит.
Johnmen (2005-02-08 15:47:00) [16]>Ega23 © (08.02.05 14:45) [8]
>Сейчас точно не вспомню, но грабли подобные встречал.
А в чём грабли ? (просто интересно...)
Serggg (2005-02-08 15:03:00) [17]В MSSQL есть функция IDENT_CURRENT, выдает текущее значение счетчика (т.е. последнее внесенное в базюку).
Serggg (2005-02-08 15:02:00) [18]В MSSQL есть функция IDENT_CURRENT, выдает текущее значение счетчика (т.е. последнее внесенное в базюку).
Serggg (2005-02-08 15:01:00) [19]У MSSQL есть функция IDENT_CURRENT, выдает текущее значение счетчика (т.е. последнее внесенное в базюку).
Ega23 (2005-02-08 14:45:00) [20]2 Johnmen © (08.02.05 14:22) [7]
Сейчас точно не вспомню, но грабли подобные встречал.