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

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

ID вставляемой записи [D6, MSSQL]


Страницы:   1 2

Ярослав ©   (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]

Сейчас точно не вспомню, но грабли подобные встречал.


Страницы:   1 2

Наверх

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