Как узнать id для новой записи в T-SQL? - CodeHelper

Как узнать id для новой записи в T-SQL?

3

Есть T-SQL скрипт, который добавляет запись в таблицу (обычный insert). Как после выполнения этого скрипта узнать идентификатор (ID) вновь созданной записи если он (id) генерируется автоматически на стороне сервера? Можно ли это сделать в том же запросе?

Новые ответы


3

Тут есть несколько вариантов. Кроме функции @@IDENTITY, о которой написал alexey-algel можно также использовать SCOPE_IDENTITY и IDENT_CURRENT.

IDENT_CURRENT — функция возвращает идентификатор последней записи, добавленной в определенную таблицу. Функция привязана именно к таблице и не привязана к области действия или сеансу. Таким образом следующие два запроса вернут одни и те же результаты:

SELECT IDENT_CURRENT("some_table")
SELECT MAX(id) FROM some_table

@@IDENTITY — возвращает идентификатор последней записи, добавленной в текущем сеансе, в любую таблицу.

SCOPE_IDENTITY — возвращает идентификатор последней записи, добавленной в текущем сеансе и в текущей области, в любую таблицу.

С функцией IDENT_CURRENT все понятно — она возвращает id только для указанной таблицы. А вот грань между @@IDENTITY и SCOPE_IDENTITY очень тонкая. Чтобы ее почувствовать можно рассмотреть классический пример. Допустим, в базе есть таблица A. На вставку записи в таблицу A установлен триггер, который добавляет запись в другую таблицу B. Тогда, если выполнить скрипт

INSERT (...) INTO A VALUES (...) SELECT SCOPE_IDENTITY

То получим идентификатор новой записи таблицы A. Если же выполним

INSERT (...) INTO A VALUES (...) SELECT @@IDENTITY

То получим аналогичный идентификатор из таблицы B. Так происходит потому, что триггер срабатывает в том же сеансе, что и вставка записи, но в другой области. Соответственно, функция @@IDENTITY видит все insert'ы сеанса, а SCOPE_IDENTITY — только текущий insert области.

1

Да, сразу после инсерта делаешь Select @@IDENTITY

@@IDENTITY - Это системная функция, которая возвращает значение идентификатора, вставленное последним.

Подробнее можно почитать в МСДН


v1.7.123.556
© 2009—2010 CodeHelper FAQ | О сайте | Обратная связь | История изменений | Статьи
Creative Commons LicenseМатериалы сайта распространяются под лицензией Creative Commons Attribution-Share Alike 3.0 Unported.