Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Втавить запись и безошибочно получить её ИД


Автор: Иван Человеков 16.5.2006, 07:05
Подскажите пожалуйста, как узнать ИД записи, которую только что вставил. Вот как я это делаю:

Код

--Вставляю новый сертификат для товара, делаем его активным
insert Sertif(activ)values(1)

--Ищу ID только что добавленного сертификата
set @maxsert=(select max(sID) from sertif)


Дело в том, что в это время другой пользователь может вставить ещё одну запись, а при поиске максимальной записи, оба будут ссылаться на одну и ту же запись. 

Автор: Иван Человеков 16.5.2006, 12:07
Спасибо разобрался:
Код

SET @ID = Scope_Identity()
 

Автор: ALKS 16.5.2006, 12:12
Ну если твой столбец c ID в таблице описан как IDENTITY, то правильнее так:

Код

SET @ID = @@IDENTITY


Но ты должен понимать что возвращаеться ID последнего перед вызовом @@IDENTITY запроса:
"Returns the last-inserted identity value." 

Автор: Balu 16.5.2006, 15:44
Цитата(ALKS @ 16.5.2006,  08:12)
Ну если твой столбец c ID в таблице описан как IDENTITY, то правильнее так:

Код

SET @ID = @@IDENTITY


Но ты должен понимать что возвращаеться ID последнего перед вызовом @@IDENTITY запроса:
"Returns the last-inserted identity value."

@@IDENTITY глобално на всю базу для текущей сессия
Scope_Identity() в рамках текущей хранимки (тригера)

Для примера попробуйте использовать @@IDENTITY в случае когда на INSERT установлен тригер с операцией добавления в другую таблицу с автоинкрементным полем. Вы будете неприятно удивлены, так как получите значение из второй таблички.  
 

Автор: ALKS 16.5.2006, 15:55
Balu, дя я знаю это. но что у нас про тригеры никто не говорил изначально smile 

Автор: Balu 17.5.2006, 11:02
Цитата(ALKS @ 16.5.2006,  11:55)
Balu, дя я знаю это. но что у нас про тригеры никто не говорил изначально smile

Это хорошо, что ты знаешь  smile 
Но у меня была ситуация, когда я вставлял логирование изменений спустя полгода, как был разработан модуль.
Логирование сделал через тригер, в бизнес логиу хранимок не лазил. И каково было мое удивление, когда вся логика работы полетела к чертям собачим. С тех пор не люблю я это идентити :-( и не советую другим юзать. 

Автор: ALKS 17.5.2006, 12:01
SCOPE_IDENTITY() и IDENT_CURRENT() появились только в MS SQL 2000. а раньше выбора особого не было smile
И появились они именно из-за описанной тобой проблемм с триггерами что прямо было написано в "What's New".

Но избегание использования тригееров есть очень хороший постулат, так что наши системы совершенно спокойно жили до этих новшеств и живут без них и дальше. smile 
 

Автор: Balu 17.5.2006, 12:57
Цитата(ALKS @ 17.5.2006,  08:01)
Но избегание использования тригееров есть очень хороший постулат, так что наши системы совершенно спокойно жили до этих новшеств и живут без них и дальше. smile

Очень напоминает анекдот про сына программиста и солнце: "... раз работает, то ничего не трогай" 

Автор: javas 25.5.2006, 01:35
Как удалить, не знаю. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)