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:
@@identityfunció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...intoconsulta.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@@identityfunciones 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@@identityfunció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 otraINSERTdeclaració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
INSERTdeclaració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,
@@Identitydevolverá la identificación de la inserción en el activador (aolog_idalgo), 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@@identitydevolverá 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