Me he encontrado con el problema de necesitar obtener el identificador autonumérico de una tabla al realizar un insert, cosa anteriormente lo había «solucionado» con un simple select después del insert consultando el id y tomando como base los campos que había acabado de ingresar… Algo como:
insert into Mi_Tabla (Cedula, Nombre, Apellido) values ('1010', 'Edwin', 'Gomez')
Y luego obtenía el identificador con.
select Autonumerico FROM Mi_Tabla WHERE Cedula = '1010' AND Nombre = 'Edwin' AND Apellido = 'Gomez'
Algo poco confiable, y como decimos en medellín: (Machetero.).
Pero no importa como lo hacia, me debería dar pena mostrárselos, Pero bueno.
Luego de tener muchos problemas con este modo de hacerlo decidí investigar sobre como hacerlo y aquí les dejo la solución.
Resulta que en SQL Server tienes 3 formas de hacerlo… Son las siguientes:
SCOPE_IDENTITY: Esta funcion te retorna el último valor de identidad en el ámbito de ejecución actual. Es decir, el último autonumerico que realizó.
@@IDENTITY: Esta contiene el último valor de identidad generado en cualquier tabla de la sesión actual.
IDENT_CURRENT: Devuelve el último valor de identidad generado para una tabla concreta de cualquier sesión y en cualquier ámbito.
Creo que ya adivinaste cual función utilizar… si, la scope_identity() es la adecuada para lo que necesitamos hacer, ya que @@IDENTITY retorna es el último identificador generado por cualquier tabla (Eso no es lo que queremos) y IDENT_CURRENT menos, ya que lo retorna de cualquier sesión y cualquier ámbito… Tabla, Base de datos, sesión, etc… (La verdad no encuentro alguna situación en donde esta me pueda servir…).
Pero, COMO SE UTILIZA?. Fácil.
Declaras una variable int para guardar el valor.
declare @a int
Realizas el insert
insert into Mi_Tabla (Cedula, Nombre, Apellido) values ('1010', 'Edwin', 'Gomez')
Asignas a la variable @a el último autonumerico generado con la función scope_identity():
select @a = scope_identity()
Seleccionas esa variable para que retorne el valor.
select @a
Esto perfectamente lo puedes recibir en un DataTable con el método Fill de un objeto SqlDataAdapter.
Espero haya sido de ayuda para alguien…