Tsql теория > Как узнать id для новой записи в T-SQL?
01.04.2013 14:35:09
Наиболее часто встречающиеся слова в статье:
[таблицу] [идентификатор] [возвращает] [области] [последней] [добавленной] [таблицы] [который] [добавляет] [IDENTITY]
Статья:
Есть T-SQL скрипт, который добавляет запись в таблицу (обычный insert). Как после выполнения этого скрипта узнать идентификатор (ID) вновь созданной записи если он (id) генерируется автоматически на стороне сервера? Можно ли это сделать в том же запросе?
Тут есть несколько вариантов. Кроме функции @@IDENTITY
, можно
также использовать 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 области.