SQL Server, pregunta de entrevista: ¿Cuáles son las diferencias entre @@IDENTITY, SCOPE_IDENTITY() e IDENT_CURRENT()?

Este artículo aplica a SQL Server. Explicaremos como obtener el último valor identity usando la variable @@IDENTITY y las funciones SCOPE_IDENTITY() e IDENT_CURRENT().

@@IDENTITY y SCOPE_IDENTITY() devuelven el último valor identity que es producido en una sola sesión (o conexión). IDENT_CURRENT() devuelve el último valor identity de acuerdo a una tabla para cualquier sesión.

@@IDENTITY

Devuelve el último valor identity generado para una tabla en la sesión actual. Esta tabla puede ser cualquier tabla de la base de datos. En otras palabras @@IDENTITY tiene un alcance global  en la base de datos para obtener el último valor identity, este valor es generado para cualquier tabla. Está limitado a la sesión actual pero no límitado en el alcance actual.

Ejemplo: Tenemos 2 tablas UNIT y SUBUNIT. La tabla UNIT tiene un “trigger” de INSERT que inserta un registro a la tabla SUBUNIT. Ahora inserta un registro a la tabla UNIT el “trigger” será ejecutado e insertará un registro en la tabla SUBUNIT también. Si revisamos el valor de @@IDENTITY será el identity de SUBUNIT en vez del de la tabla UNIT.

SCOPE_IDENTITY()

Devuelve el último valor identity generado para una tabla particular en la sesión actual. No está limitado a la sesión actual pero está limitado en el alcance actual.

Ejemplo: Tenemos dos tablas UNIT y SUBUNIT. La tabla UNIT tiene un “trigger” de INSERT que inserta un registro a la tabla SUBUNIT. Ahora inserta un registro a la tabla UNIT el “trigger” será ejecutado e insertará un registro en la tabla SUBUNIT también. Si revisamos el valor de SCOPE_IDENTITY() será el identity de UNIT en vez del de la tabla SUBUNIT.

IDENT_CURRENT()

Devuelve el último valor identity generado por cualquier tabla que es pasada como parámetro a esta función. No está limitado a la sesión actual o al alcance actual. Pero está limitado a una tabla, en otras palabras, depende de la tabla que se pase como parámetro.

IDENT_CURRENT('nombre_de_la_tabla');

Conclusión.

Ambos @@IDENTITY y SCOPE_IDENTITY devolverán el último valor identity en la sesión actual pero son diferentes en su alcance. IDENT_CURRENT() no depende de la sesión actual o en alcance actual.

Extraído de CodeProject.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s