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

Tsql теория > Как узнать id для новой записи в T-SQL?
01.04.2013 14:35:09



Статья:

Есть 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 области.