sql - obtener - @@ IDENTIDAD, SCOPE_IDENTITY(), OUTPUT y otros métodos para recuperar la última identidad
select scope_identity() ejemplo (8)
@@ Identidad es la forma de la vieja escuela. Use SCOPE_IDENTITY () en todas las instancias en el futuro. Consulte MSDN por las repercusiones del uso de @@ IDENTITY (¡son malas!).
He visto varios métodos utilizados al recuperar el valor de un campo de identidad de clave principal después de la inserción.
declare @t table (
id int identity primary key,
somecol datetime default getdate()
)
insert into @t
default values
select SCOPE_IDENTITY() --returns 1
select @@IDENTITY --returns 1
Devolviendo una tabla de identidades después de insertar:
Create Table #Testing (
id int identity,
somedate datetime default getdate()
)
insert into #Testing
output inserted.*
default values
¿Qué método es correcto o mejor? ¿El método OUTPUT es seguro para el alcance?
El segundo fragmento de código se tomó prestado de SQL en estado salvaje
Depende de lo que estés tratando de hacer...
@@IDENTIDAD
Devuelve el último valor de IDENTIDAD producido en una conexión, independientemente de la tabla que produjo el valor, e independientemente del alcance de la declaración que produjo el valor. @@ IDENTITY devolverá el último valor de identidad ingresado en una tabla en su sesión actual. @@ IDENTITY está limitado a la sesión actual y no está limitado al alcance actual. Por ejemplo, si tiene un desencadenante en una tabla que hace que se cree una identidad en otra tabla, obtendrá la identidad que se creó en último lugar, incluso si fue el desencadenador que la creó.
SCOPE_IDENTITY ()
Devuelve el último valor de IDENTIDAD producido en una conexión y por una declaración en el mismo ámbito, independientemente de la tabla que produjo el valor. SCOPE_IDENTITY () es similar a @@ IDENTITY, pero también limitará el valor a su alcance actual. En otras palabras, devolverá el último valor de identidad que creó explícitamente, en lugar de la identidad creada por un desencadenante o una función definida por el usuario.
IDENT_CURRENT ()
Devuelve el último valor de IDENTIDAD producido en una tabla, independientemente de la conexión y el alcance de la declaración que produjo el valor. IDENT_CURRENT está limitado a una tabla especificada, pero no por conexión o alcance.
Hay otro método disponible en SQL Server 2005 que se describe en SQL in the Wild .
Esto le permitirá recuperar múltiples identidades después de la inserción. Aquí está el código de la publicación del blog:
Create Table #Testing (
id int identity,
somedate datetime default getdate()
)
insert into #Testing
output inserted.*
default values
No hay casi ninguna razón para usar nada además de una cláusula OUTPUT
cuando intenta obtener la identidad de la (s) fila (s) recién insertada (s). La cláusula OUTPUT es alcance y tabla segura.
Aquí hay un ejemplo simple de obtener la identificación después de insertar una sola fila ...
DECLARE @Inserted AS TABLE (MyTableId INT);
INSERT [MyTable] (MyTableColOne, MyTableColTwo)
OUTPUT Inserted.MyTableId INTO @Inserted
VALUES (''Val1'',''Val2'')
SELECT MyTableId FROM @Inserted
Documentos detallados para la cláusula OUTPUT: http://technet.microsoft.com/en-us/library/ms177564.aspx
-- table structure for example:
CREATE TABLE MyTable (
MyTableId int NOT NULL IDENTITY (1, 1),
MyTableColOne varchar(50) NOT NULL,
MyTableColTwo varchar(50) NOT NULL
)
Sé cuidadoso al usar @@ IDENTITY ...
http://dotnetgalactics.wordpress.com/2009/10/28/scope-identity-vs-identity/
SCOPE_IDENTITY es suficiente para filas individuales y se recomienda excepto en los casos en que necesite ver el resultado de un GATILLO intermedio por algún motivo (¿por qué?).
Para filas múltiples, OUTPUT / OUTPUT INTO es su nuevo mejor amigo y una alternativa para volver a encontrar las filas e insertarlas en otra tabla.
Tenga en cuenta que hay un error en scope_identity () y @@ identity: consulte connect: https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=328811
Una cita (de Microsoft):
"Recomiendo encarecidamente usar OUTPUT en lugar de @@ IDENTITY en todos los casos. Es la mejor forma de leer la identidad y la marca de tiempo".
Editado para agregar: esto puede corregirse ahora, Connect me está dando un error, pero mira:
Una pequeña corrección a la respuesta de Godeke:
No son solo factores desencadenantes de los que debe preocuparse. Cualquier tipo de operación anidada, como procs almacenados, que hace que se creen identificadores podría cambiar el valor de @@ IDENTIDAD.
Otro voto para scope_identity ...