Форум: "Базы";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];
ВнизID вставляемой записи Найти похожие ветки
← →
Ярослав (2005-02-07 18:24) [0]Подскажите как узнать идентификатор записи при вставке из Delphi в базу MS SQL, т.е. я вставляю запись и знаю что запись произошла успешно, но как мне ее потом найти, что бы установить на ее курсор в DB Grid
← →
msguns © (2005-02-07 18:27) [1]Перед записью "дергать" генератор или что там вместо него у мелкомягкой скалы.
← →
Ярослав (2005-02-07 20:18) [2]Эх...нету у него генератора...
← →
Johnmen © (2005-02-07 21:49) [3]
Query.SQL.Text:=
"INSERT INTO ...;
SELECT @@Identity AS NewId";
Query.Open;
NewId:=Query.FieldByName("NewId").AsInteger;
← →
Anatoly Podgoretsky © (2005-02-07 22:46) [4]msguns © (07.02.05 18:27) [1]
У него IDENTITY а это не генератор и дергать его нельзя. Это только немного похоже на генератор, по сути ближе к автоинкриментному полю.
← →
msguns © (2005-02-08 13:28) [5]>Anatoly Podgoretsky © (07.02.05 22:46) [4]
>У него IDENTITY а это не генератор и дергать его нельзя. Это только немного похоже на генератор, по сути ближе к автоинкриментному полю.
Спасиб за справку. Со скалой не приходилось работать, только с акцесом. Про identity знал, конечно, но не знал что в скале он остался без изменений.
← →
Ega23 © (2005-02-08 13:53) [6]2 Johnmen © (07.02.05 21:49) [3]
я бы всё-таки написал немного по-другому:
Query.SQL.Text:=
"Declare @X int
Set NoCount ON
INSERT INTO ...;
Select @X=@@IDENTITY
Set NoCount OFF
SELECT NewId=@X";
Query.Open;
NewId:=Query.FieldByName("NewId").AsInteger;
← →
Johnmen © (2005-02-08 14:22) [7]>Ega23 © (08.02.05 13:53) [6]
Почему ?
← →
Ega23 © (2005-02-08 14:45) [8]2 Johnmen © (08.02.05 14:22) [7]
Сейчас точно не вспомню, но грабли подобные встречал.
← →
Serggg (2005-02-08 15:01) [9]У MSSQL есть функция IDENT_CURRENT, выдает текущее значение счетчика (т.е. последнее внесенное в базюку).
← →
Serggg (2005-02-08 15:02) [10]В MSSQL есть функция IDENT_CURRENT, выдает текущее значение счетчика (т.е. последнее внесенное в базюку).
← →
Serggg (2005-02-08 15:03) [11]В MSSQL есть функция IDENT_CURRENT, выдает текущее значение счетчика (т.е. последнее внесенное в базюку).
← →
Johnmen © (2005-02-08 15:47) [12]>Ega23 © (08.02.05 14:45) [8]
>Сейчас точно не вспомню, но грабли подобные встречал.
А в чём грабли ? (просто интересно...)
← →
Nikolay M. © (2005-02-08 16:30) [13]
> Serggg (08.02.05 15:01) [9]
> У MSSQL есть функция IDENT_CURRENT, выдает текущее значение
> счетчика (т.е. последнее внесенное в базюку).
И на фига ему это?
IDENT_CURRENT returns the last identity value generated for a specific table in any session and any scope.
Нужно @@IDENTITY или SCOPE_IDENTITY().
> А в чём грабли ? (просто интересно...)
Имхо, грабли могут быть для БДЕ/ОДБЦ. Например, если в Екселе создать такой запрос для внешних данных:DECLARE @x
SELECT @x = 123
EXEC dbo.Proc @Param = @х
то без ноукаунта Ексель решит, что результат инициализации @x (сопровождающийся "1 rows affected") будет результатом выполнения ВСЕГО батча и собственно сам резалт-датасет не подхватит.
← →
Anatoly Podgoretsky © (2005-02-08 17:59) [14]Кстати как трактовать session и scope при работе с MSSQL через ADO. Относить это к соединению, транзакции или к отдельному запросу?
← →
Johnmen © (2005-02-08 18:06) [15]>Nikolay M. © (08.02.05 16:30) [13]
>> А в чём грабли ? (просто интересно...)
Имелись в виду грабли с АДО&MSSQL для [3]
← →
Nikolay M. © (2005-02-08 18:09) [16]
> Johnmen © (08.02.05 18:06) [15]
> >> А в чём грабли ? (просто интересно...)
>
> Имелись в виду грабли с АДО&MSSQL для [3]
Я лично не наблюдал. Так что мне бы тоже было интересно :)
← →
Fay © (2005-02-09 05:17) [17]Ega23 © (08.02.05 13:53) [6]
Согласен,Set NoCount ON
не повредит, но зачемSet NoCount OFF
?
← →
kivadim (2005-02-09 13:50) [18]to Johnmen
Query.SQL.Text:=
"INSERT INTO ...;
SELECT @@Identity AS NewId";
Query.Open;
Это что в одном запросе?
← →
Ega23 © (2005-02-09 13:57) [19]Это что в одном запросе?
Да. А почему бы и нет?
← →
Johnmen © (2005-02-09 14:04) [20]>Это что в одном запросе?
Это же АДО.
← →
Ega23 © (2005-02-09 14:11) [21]2 Fay © (09.02.05 05:17) [17]
Ega23 © (08.02.05 13:53) [6]
Согласен, Set NoCount ON не повредит, но зачем Set NoCount OFF?
А это уже по-привычке, после BDE... :о)
← →
kivadim (2005-02-09 14:36) [22]Query.SQL.Text:="SELECT @@Identity AS NewId";
Query.Open;
будет актуальное значение возвращать, если данные вводились через
серверную процедуру?
← →
Ega23 © (2005-02-09 14:44) [23]Нет. Точнее, не факт.
Любая вставка в таблицу с identity полем приводит к обновлению глобальной серверной переменной @@IDENTITY.
Если прочитать её значение сразу же после вставки в рамках одной транзакции - то будет всё ОК. Если пытаться читать её разными транзакциями - то леший его знает, что в ней будет.
← →
Shirson © (2005-02-09 18:25) [24]@@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 погонял?). К сожалению, подробности пронеслись ужасом больше года назад, поэтому точно проблему не упомню. Помню только, что матерился долго и заковыристо :)
← →
Deniz (2005-02-10 08:08) [25]Можно и мне один вопрос прояснить для самообразования?
Если я правильно понял, то чтобы получить ID последней вставленной мною записи, можно выполнить insert и выбрать SCOPE_IDENTITY, и гарантия того, что SCOPE_IDENTITY не изменится с последнего insert"а?
← →
Anatoly Podgoretsky © (2005-02-10 08:50) [26]Автоинкриментные поля на то и авто, чтобы их не изменяли руками.
← →
Ega23 © (2005-02-10 09:48) [27]Если я правильно понял, то чтобы получить ID последней вставленной мною записи, можно выполнить insert и выбрать SCOPE_IDENTITY, и гарантия того, что SCOPE_IDENTITY не изменится с последнего insert"а?
Это только в MS SQL 2000 и выше. В предыдущих версиях этого не было, была только глобальная переменная @@IDENTITY
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.04 c