¿Cuál es la mejor manera de obtener la identidad de la fila insertada?

¿Cuál es la mejor manera de obtener el IDENTIDAD de la fila insertada?

Conozco el @@IDENTITY y IDENT_CURRENT y SCOPE_IDENTITY pero no entiendo los pros y los contras de cada uno.

¿Puede alguien explicarme las diferencias y cuándo debería usar cada una?

Solución
  • @@IDENTITY]1 devuelve el último valor de identidad generado para cualquier tabla en la sesión actual, en todos los ámbitos. Hay que tener cuidado aquí, ya que es a través de los ámbitos. Podrías obtener un valor de un trigger, en lugar de tu sentencia actual.

  • SCOPE_IDENTITY()]2 devuelve el último valor de identidad generado para cualquier tabla en la sesión actual y el ámbito actual. Generalmente es lo que quieres usar.

  • IDENT_CURRENT('tableName') devuelve el último valor de identidad generado para una tabla específica en cualquier sesión y cualquier ámbito. Esto te permite especificar de qué tabla quieres el valor, en caso de que los dos anteriores no sean lo que necesitas (muy raro). Además, como mencionó @Guy Starbuck, "Podrías usar esto si quieres obtener el valor actual de IDENTIDAD para una tabla en la que no has insertado ningún registro".

  • La cláusula OUTPUT de la sentencia INSERT te permitirá acceder a todas las filas que se hayan insertado a través de esa sentencia. Dado que se refiere a la sentencia específica, es más sencillo que las otras funciones anteriores. Sin embargo, es un poco más verboso (tendrá que insertar en una variable de tabla/tabla temporal y luego consultarla) y da resultados incluso en un escenario de error en el que la sentencia se revierte. Dicho esto, si su consulta utiliza un plan de ejecución en paralelo, este es el único método garantizado para obtener la identidad (sin desactivar el paralelismo). Sin embargo, se ejecuta antes de los disparos y no puede utilizarse para devolver valores generados por disparos.

Comentarios (14)

MSDN

@@IDENTITY, SCOPE_IDENTITY e IDENT_CURRENT son funciones similares en el sentido de que devuelven el último valor insertado en la columna IDENTITY de una tabla.

@@IDENTITY y SCOPE_IDENTITY devolverán el último valor de identidad generado en cualquier tabla de la sesión actual. Sin embargo, SCOPE_IDENTITY devuelve el valor sólo dentro del ámbito actual; @@IDENTITY no se limita a un ámbito específico.

IDENT_CURRENT no está limitado por el ámbito y la sesión; está limitado a una tabla específica. IDENT_CURRENT devuelve el valor de identidad generado para una tabla específica en cualquier sesión y cualquier ámbito. Para más información, véase IDENT_CURRENT.

  • IDENT_CURRENT]2 es una función que toma una tabla como argumento.
  • @@IDENTITY]3 puede devolver un resultado confuso cuando se tiene un trigger en la tabla
  • SCOPE_IDENTITY es su héroe la mayor parte del tiempo.
Comentarios (0)

La identidad es la última identidad insertada usando la conexión SQL actual. Este es un buen valor para devolver desde un procedimiento almacenado de inserción, donde sólo necesita la identidad insertada para su nuevo registro, y no le importa si se añadieron más filas después.

El valor de SCOPE_IDENTITY es la última identidad insertada usando la Conexión SQL actual, y en el ámbito actual -- es decir, si hubiera una segunda IDENTIDAD insertada basada en un trigger después de tu inserción, no se reflejaría en SCOPE_IDENTITY, sólo en la inserción que realizaste. Francamente, nunca he tenido una razón para usar esto.

IDENT_CURRENT(tablename) es la última identidad insertada independientemente de la conexión o el ámbito. Podrías utilizarlo si quieres obtener el valor de IDENTIDAD actual de una tabla en la que no has insertado ningún registro.

Comentarios (2)