¿Cómo obtener el siguiente número de identidad utilizado en SQL 2005 y ASP?
-
08-07-2019 - |
Pregunta
Anteriormente estaba obteniendo el siguiente número automático disponible utilizado en Access haciendo una consulta simple como esta:
SELECT RecordNumber, Info FROM myTABLE WHERE 0=1
De esta forma podría crear una variable para contener el CurrentRecord y usará el mismo número automático que Access iba a usar cuando estaba actualizando la fila
Ejemplo
rs.AddNew
currentRecord = rs("RecordNumber")
rsInfo = "SomeFormData" & currentRecord
rs.Update
rs.Close
Ahora, esto solía funcionar en MS Access, pero en SQL 2005, no recupero la identidad creada por el nuevo registro. " SomeFormData " se insertó correctamente, el campo RecordNumber en SQL se rellenó con el nuevo número automático, pero no tengo el RecordNumber en mis variables y lo necesito para continuar rellenando formularios relacionados, que guardan datos en tablas relacionadas y necesito guardar el número de registro actual.
La pregunta es, ¿hay alguna forma de recuperar este número único al hacer una nueva inserción?
Solución
IDENT_CURRENT ('tableName')
(incluye las comillas simples) devuelve el valor actual de la identidad para la tabla dada. Este valor debe ser el último valor de identidad asignado utilizado en la tabla. En otras palabras, tendrá una fila con este valor de identidad ya en la tabla, a menos que esa fila se haya eliminado. El valor de identidad que se asignará en el próximo INSERT
será IDENT_CURRENT ('tableName') + IDENT_INCR ('tableName')
.
No recomiendo confiar en esto, sin embargo. Si predetermina el siguiente valor de identidad de esta manera, seguramente terminará en una situación en la que otro proceso realiza la inserción que realmente obtiene esa ID antes que la suya, por lo que su proceso termina usando el valor de ID incorrecto.
Es mucho mejor hacer su inserción primero (incluso si aún no tiene todos los datos) y usar SCOPE_IDENTITY ()
para obtener la ID real asignada.
Quizás se pregunte por qué SCOPE_IDENTITY ()
es mejor que IDENT_CURRENT ('tableName')
. Como su nombre lo indica, el primero le dará el valor de identidad más reciente asignado dentro de su alcance actual (su lote, su proceso almacenado, lo que sea), mientras que el último le dará la identidad más reciente asignada en la tabla, por cualquier persona. Aunque puede llamar a IDENT_CURRENT
justo después de ' INSERT
, aún es posible que el INSERT
de otra persona se encuentre en el medio, y IDENT_CURRENT
le dará el valor de identidad que resultó de su inserción en lugar del suyo, mientras que SCOPE_IDENTITY
siempre le dará el suyo.
EDITAR :
También vale la pena mencionar que SCOPE_IDENTITY ()
es favorecido sobre el @@ IDENTITY
de funcionamiento similar. Si bien ambos devuelven el último valor de identidad asignado dentro del lote actual, @@ IDENTITY
se ve afectado por las inserciones que ocurren dentro de los disparadores; SCOPE_IDENTITY ()
no lo es.
Otros consejos
SELECT CAST (Scope_Identity () AS INT)