Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.13;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.025 c
14-1108983986
КаПиБаРа
2005-02-21 14:06
2005.03.13
По поводу <<Поле "Тема вопроса" не оформлено>>


11-1092770529
Алексей
2004-08-17 23:22
2005.03.13
Как убрать кнопку программы на панели задач?


14-1108629326
КаПиБаРа
2005-02-17 11:35
2005.03.13
Психологическая разгрузка


3-1108144152
Oleg_
2005-02-11 20:49
2005.03.13
как после открытия query указать что некоторое поле вычисляемое?


1-1109759071
Pietro
2005-03-02 13:24
2005.03.13
копирование файлов в буфер обмена