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?

¿Fue útil?

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)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top