sqlserver - ¿Cómo obtener el siguiente número de identidad utilizado en SQL 2005 y ASP?
restart identity sql server 2008 (2)
Anteriormente obtenía el siguiente autonumber 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 mantener el registro actual y usará el mismo autonumero que Access usaría cuando estaba actualizando la fila
Ejemplo
rs.AddNew
currentRecord = rs("RecordNumber")
rsInfo = "SomeFormData" & currentRecord
rs.Update
rs.Close
Ahora bien, esto sirve para trabajar en MS Access, pero en SQL 2005, no recupero la identidad creada por el nuevo registro. "SomeFormData" se ha insertado correctamente, el campo RecordNumber en SQL se ha rellenado con el nuevo número automático, pero no tengo RecordNumber en mis variables y necesito que continúe rellenando formularios relacionados, que guarden datos en tablas relacionadas y necesiten para guardar el número actual de Grabación.
La pregunta es, ¿hay alguna forma de recuperar este número único cuando se hace un nuevo inserto?
SELECT CAST (Scope_Identity () AS INT)
IDENT_CURRENT(''tableName'')
(incluya 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 haya sido eliminada. El valor de identidad que se asignará en el siguiente INSERT
será IDENT_CURRENT(''tableName'') + IDENT_INCR(''tableName'')
.
Sin embargo, no recomiendo confiar en esto. Si predetermina el siguiente valor de identidad de esta manera, es probable que termine en una situación en la que otro proceso haga que la inserción que realmente obtiene esa ID antes que la suya lo haga, de modo que su proceso termine usando el valor de ID incorrecto.
Es mucho mejor hacer primero su inserción (incluso si todavía no tiene todos los datos), y usar SCOPE_IDENTITY()
para obtener la identificación 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 segundo le dará la identidad más reciente asignada sobre la mesa, por cualquier persona. Aunque puede llamar a IDENT_CURRENT
justo después de '' INSERT
, aún es posible que ocurra el INSERT
otra persona en el medio, e IDENT_CURRENT
le dará el valor de identidad que resultó de su inserción en vez del suyo, mientras que SCOPE_IDENTITY
siempre le dará la suya.
EDITAR :
También vale la pena mencionar que SCOPE_IDENTITY()
tiene preferencia sobre @@IDENTITY
funciona de manera similar. Mientras que ambos devuelven el último valor de identidad asignado dentro del lote actual, @@IDENTITY
se ve afectado por inserciones que ocurren dentro de los desencadenadores; SCOPE_IDENTITY()
no es.