Есть T-SQL скрипт, который добавляет запись в таблицу (обычный insert). Как после выполнения этого скрипта узнать идентификатор (ID) вновь созданной записи если он (id) генерируется автоматически на стороне сервера? Можно ли это сделать в том же запросе?
Как узнать id для новой записи в T-SQL?
Новые ответы
Тут есть несколько вариантов. Кроме функции @@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 области.
Да, сразу после инсерта делаешь Select @@IDENTITY
@@IDENTITY - Это системная функция, которая возвращает значение идентификатора, вставленное последним.
Подробнее можно почитать в МСДН