Как получить следующий идентификационный номер, используемый в SQL 2005 и ASP? - PullRequest
4 голосов
/ 19 ноября 2008

Ранее я получал следующий доступный автономный номер, используемый в Access, выполняя простой запрос:

SELECT RecordNumber, Info FROM myTABLE WHERE 0=1

Таким образом, я мог бы создать переменную для хранения currentRecord, и она будет использовать тот же номер автономера, который Access собирался использовать, когда я обновлял строку

Пример

rs.AddNew
currentRecord = rs("RecordNumber")

rsInfo = "SomeFormData" & currentRecord
rs.Update
rs.Close

Теперь это используется для работы в MS Access, но в SQL 2005 я не возвращаю идентичность, созданную новой записью. «SomeFormData» вставлена ​​правильно, поле RecordNumber в SQL заполнено новым автоматическим номером, но у меня нет RecordNumber в моих переменных, и мне нужно, чтобы он продолжал заполнять связанные формы, сохраняя данные в связанных таблицах, и по необходимости сохранить номер текущей записи.

Вопрос в том, есть ли способ вернуть этот уникальный номер при новой вставке?

Ответы [ 2 ]

9 голосов
/ 19 ноября 2008

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() нет.

1 голос
/ 19 ноября 2008

ВЫБЕРИТЕ CAST (Scope_Identity () AS INT)

...