IDENT_CURRENT('tableName')
(включая одинарные кавычки) возвращает текущее значение идентификатора для данной таблицы. Это значение должно быть последним назначенным значением идентификатора, использованным в таблице. Другими словами, у вас будет строка с этим значением идентификатора уже в таблице, если только эта строка не была удалена. Значение идентификатора, которое будет назначено на следующем INSERT
, будет IDENT_CURRENT('tableName') + IDENT_INCR('tableName')
.
Однако я не рекомендую полагаться на это. Если вы заранее определите следующее значение идентификатора таким образом, вы обязательно окажетесь в ситуации, когда другой процесс делает вставку, которая на самом деле получает этот идентификатор раньше, чем ваш, поэтому ваш процесс завершается с использованием неверного значения идентификатора.
Гораздо лучше сначала сделать вставку (даже если у вас еще нет всех данных) и использовать SCOPE_IDENTITY()
, чтобы получить фактический присвоенный идентификатор.
Вы можете спросить, почему SCOPE_IDENTITY()
лучше, чем IDENT_CURRENT('tableName')
. Как следует из названия, первое даст вам самое последнее значение идентификатора, назначенное в вашей текущей области (ваш пакет, сохраненный процесс и т. Д.), Тогда как второе даст вам самое последнее удостоверение, назначенное в таблице кем-либо. Даже если вы могли бы вызвать IDENT_CURRENT
сразу после 'INSERT
, все же возможно, что чей-то INSERT
окажется между ними, и IDENT_CURRENT
даст вам значение идентификатора, полученное вместо их insert ваш, тогда как SCOPE_IDENTITY
всегда даст вам ваш.
EDIT
Стоит также отметить, что SCOPE_IDENTITY()
предпочтительнее аналогично @@IDENTITY
. В то время как оба возвращают последнее значение идентификатора, назначенное в текущем пакете, на @@IDENTITY
влияют вставки, которые происходят в триггерах; SCOPE_IDENTITY()
нет.