ultimo sqlserver obtener insertado ident_current checkident sql asp-classic ado identity autonumber

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.