Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как в MSSQL узнать PK для новой записи?  [new]
zDIV
Member

Откуда: Оренбург
Сообщений: 390
В Interbase для IDENTITY-primary key используются генераторы и триггеры, которые можно реализовать так, что либо генератор сам присваивает значение PK для новой записи, либо, если он задан, не вмешивается в смену значений, при этом можно из ХП получить из генератора очередное значение и использовать его для вставки (чтобы знать его значения для последующих вставок данных). А как поступают в MSSQL?
19 авг 03, 15:02    [306027]     Ответить | Цитировать Сообщить модератору
 Re: Как в MSSQL узнать PK для новой записи?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Да по всякому поступают. И так, и сяк... Как удобно или что наиболее отвечает бизнеслогике и/или производительности. Посмотри в учебных база...
19 авг 03, 15:05    [306040]     Ответить | Цитировать Сообщить модератору
 Re: Как в MSSQL узнать PK для новой записи?  [new]
zDIV
Member

Откуда: Оренбург
Сообщений: 390
Дайте, пожалуйста, хоть что-нибудь, можно фразами, типа, через переменные... Учебная база это что - единственная после инсталляции MSSQL 2000 какая-то North?..
19 авг 03, 15:11    [306056]     Ответить | Цитировать Сообщить модератору
 Re: Как в MSSQL узнать PK для новой записи?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Ну, например, если в таблице первичный ключ имеет свойство IDENTITY (или вообще в таблице есть поле с таки свойством), то после вставки одной строки можно определить значение этого поля для вновь вставленной строки через SCOPE_IDENTITY(), которая вернет его и только его...
19 авг 03, 15:16    [306070]     Ответить | Цитировать Сообщить модератору
 Re: Как в MSSQL узнать PK для новой записи?  [new]
zDIV
Member

Откуда: Оренбург
Сообщений: 390
1) Т.е. вставку делаем в ХП, которая и возвращает значение РК...
2) А вдруг после одной вставки осуществиться другая от другого клиента, что тогда? Или пока осуществляется ХП, другие клиенты ждут, или нужно ради этого значения что-то блоктровать, запрещать или что, не ясно.
19 авг 03, 15:22    [306089]     Ответить | Цитировать Сообщить модератору
 Re: Как в MSSQL узнать PK для новой записи?  [new]
Berg
Member

Откуда: Кр-ск
Сообщений: 3480
SCOPE_IDENTITY( )

Returns the last IDENTITY value inserted into an IDENTITY column IN THE SAME SCOPE. A scope is a module -- a stored procedure, trigger, function, or batch.

Так что никаких дополнительных усилий/блокировок не требуется...
19 авг 03, 16:01    [306176]     Ответить | Цитировать Сообщить модератору
 Re: Как в MSSQL узнать PK для новой записи?  [new]
zDIV
Member

Откуда: Оренбург
Сообщений: 390
Хорошо... Ну а теоритически возможно же, при выполнении параллельно ХП от двух клиентов вставляются две записи в одну и ту же таблу и ХП в обоих вариантах возвращает одно и тоже значение? Чем достигается гарантия между INSERT и SCOPE_IDENTITY( )... Например, было бы понятно, что гарантия достигается их использованием в ХП (сервер выполняет ХП от клиентов последовательно), или непосредственным следованием в ХП SCOPE_IDENTITY( ) сразу за INSERT (???), хитрой работой SCOPE_IDENTITY( ) (отслеживает последнии вставки для каждого клиента отдельно). Явно такое не прокатит, что отдельно выполняем из клиента INSERT, а потом из простейшей ХП получаем last-значение.
19 авг 03, 16:30    [306234]     Ответить | Цитировать Сообщить модератору
 Re: Как в MSSQL узнать PK для новой записи?  [new]
UnknownMember
Guest
V helpe po SCOPE_IDENTITY() ochen' obstojatel'no napisano pro to, kakije funkcii suschestvujut dlja opredelenija poslednego znachenija PK, gde i kak ih primenjat'.
19 авг 03, 16:36    [306269]     Ответить | Цитировать Сообщить модератору
 Re: Как в MSSQL узнать PK для новой записи?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31596
2zDIV
Гарантия достигается именно хитрой работой SCOPE_IDENTITY( ) (отслеживает последнии вставки для каждого клиента отдельно).

Но работает она только в пределах одного батча (процедуры), хотя сервер выполняет процедуры от клиентов не последовательно.
19 авг 03, 18:48    [306556]     Ответить | Цитировать Сообщить модератору
 Re: Как в MSSQL узнать PK для новой записи?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Кстати, и появилась эта SCOPE_IDENTITY() только в MSSQL2000. В 7-е её небыло.
20 авг 03, 07:13    [306802]     Ответить | Цитировать Сообщить модератору
 Re: Как в MSSQL узнать PK для новой записи?  [new]
zDIV
Member

Откуда: Оренбург
Сообщений: 390
Спасибо всем, особенно гостю. Просил только фразу, но искусился на полную помощь. Разобрался. Все-таки первое впечатление мое таково (я часто ошибаюсь) - в MS SQL порядочный бардак в синтаксисе, даже на одну тему IDENTITY две функции и одна переменная (удивляет не количество, а разнородность). Как вообще обходились без SCOPE_IDENTITY в ранних версиях только c @@IDENTITY. В IB реализовано идеально с помощью генераторов и триггеров до вставки, нужен ид., возьми в любой момент и знай его.

Да, "совместимость" между IB и MS SQL паршивенькая как со стороны организации самой СУБД (тут уж куда деваться, срочно нужен очередной стандарт SQL 200X), так и со стороны многострадательных клиентских приложений. А ведь у меня была идея написать приложения для БД, реализованной в двух вариантах IB и SQL (от идеи не отказываюсь). Вывод один - все уродливые по синтаксису чихи прятать в ХП!
20 авг 03, 08:29    [306850]     Ответить | Цитировать Сообщить модератору
 Re: Как в MSSQL узнать PK для новой записи?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31596
2zDIV

Вообще генератор не требует специальной поддержки СУБД, его можно сделать самому с пом. спец. таблицы.

@@IDENTITY - это ф-ция из сайбеса. Вот так-уж криво было там сделано. У МС было 2 пути - похерить старые приложения, изменив поведение @@IDENTITY, или ввести новую ф-цию. Т.к. МС хочет бабок (и пользователей), она выбрала второй путь :-)

Ну а совместимость у всех СУБД плохая. Стандарта-то нет (кроме языка запросов). Вот у IB и Cache совместимость ещё хуже. Там Вы даже за процедурами не скроете различий.
20 авг 03, 09:30    [306953]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить