Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.053 c
11-1092303141
Turkirill
2004-08-12 13:32
2005.03.13
Как в RichEdit изменить курсор ввода текста на свой.


6-1104808568
Трям
2005-01-04 06:16
2005.03.13
Железо удалённого компьютера


3-1108019366
Dmitry
2005-02-10 10:09
2005.03.13
Проблемы с Firebird 1.5?


1-1109279193
akvilon
2005-02-25 00:06
2005.03.13
один TStrings


3-1108037879
Denmin
2005-02-10 15:17
2005.03.13
Можно ли в таблице поставить фильтр?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский