ultimo scope_identity obtener insertado ejemplo sql sql-server tsql identity output-clause

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 )



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.



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 ...