Yo sé Scope_Identity()
, Identity()
, @@Identity
, y Ident_Current()
todas consigo el valor de la columna de identidad, pero me gustaría saber la diferencia.
Parte de la controversia que estoy teniendo es ¿qué quieren decir con alcance según se aplica a estas funciones anteriores?
También me encantaría un ejemplo simple de diferentes escenarios de uso de ellos?
sql
sql-server
identity
Tebo
fuente
fuente
Respuestas:
@@identity
función devuelve la última identidad creada en la misma sesión.scope_identity()
función devuelve la última identidad creada en la misma sesión y el mismo alcance.ident_current(name)
devuelve el último identidad creada para una tabla específica o ver en cualquier sesión.identity()
función no se usa para obtener una identidad, se usa para crear una identidad en unaselect...into
consulta.La sesión es la conexión de la base de datos. El alcance es la consulta actual o el procedimiento almacenado actual.
Una situación en la que
scope_identity()
las@@identity
funciones y difieren es si tiene un activador en la tabla. Si tiene una consulta que inserta un registro, haciendo que el activador inserte otro registro en algún lugar, lascope_identity()
función devolverá la identidad creada por la consulta, mientras que la@@identity
función devolverá la identidad creada por el activador.Entonces, normalmente usarías la
scope_identity()
función.fuente
Buena pregunta.
@@IDENTITY
: devuelve el último valor de identidad generado en su conexión SQL (SPID). La mayoría de las veces será lo que desea, pero a veces no lo es (como cuando se dispara un disparador en respuesta a unINSERT
, y el disparador ejecuta otraINSERT
declaración).SCOPE_IDENTITY()
: devuelve el último valor de identidad generado en el ámbito actual (es decir, procedimiento almacenado, disparador, función, etc.).IDENT_CURRENT()
: devuelve el último valor de identidad para una tabla específica. No use esto para obtener el valor de identidad de unINSERT
, está sujeto a condiciones de carrera (es decir, múltiples conexiones que insertan filas en la misma tabla).IDENTITY()
: se utiliza al declarar una columna en una tabla como columna de identidad.Para obtener más información, consulte: http://msdn.microsoft.com/en-us/library/ms187342.aspx .
Para resumir: si está insertando filas y desea conocer el valor de la columna de identidad para la fila que acaba de insertar, utilice siempre
SCOPE_IDENTITY()
.fuente
Si comprende la diferencia entre el alcance y la sesión, será muy fácil comprender estos métodos.
Una muy buena publicación de blog de Adam Anderson describe esta diferencia:
Por lo tanto, las diferencias entre los tres métodos de recuperación de identidad son las siguientes:
fuente
Alcance significa el contexto de código que realiza la
INSERT
declaraciónSCOPE_IDENTITY()
, a diferencia del alcance global de@@IDENTITY
.Da resultados diferentes.
fuente
Para aclarar el problema con
@@Identity
:Por ejemplo, si inserta una tabla y esa tabla tiene activadores que realizan inserciones,
@@Identity
devolverá la identificación de la inserción en el activador (aolog_id
algo), mientrasscope_identity()
que devolverá la identificación de la inserción en la tabla original.Entonces, si no tiene ningún desencadenante
scope_identity()
y@@identity
devolverá el mismo valor. Si tiene desencadenantes, debe pensar qué valor le gustaría.fuente
Scope Identity
: Identidad del último registro agregado dentro del procedimiento almacenado que se está ejecutando.@@Identity
: Identidad del último registro agregado dentro del lote de consulta, o como resultado de la consulta, por ejemplo, un procedimiento que realiza una inserción, luego dispara un disparador que luego inserta un registro devolverá la identidad del registro insertado desde el disparador.IdentCurrent
: La última identidad asignada para la tabla.fuente
Aquí hay otra buena explicación del libro :
fuente