Pregunta

¿Cuál es la mejor manera de conseguir IDENTITY de la fila insertada?

Yo sé acerca de @@IDENTITY y IDENT_CURRENT y SCOPE_IDENTITY pero no entender los pros y los contras adjunta a cada uno.

Por favor alguien puede explicar las diferencias y, cuando debería ser el uso de cada uno de ellos?

¿Fue útil?

Solución

  • @@IDENTITY devuelve el último valor de identidad generado por cualquier tabla en la sesión actual, en todos los ámbitos. Usted necesita tener cuidado aquí, ya que es a través de los ámbitos.Usted podría obtener un valor de un disparo, en lugar de su estado de cuenta actual.

  • SCOPE_IDENTITY() devuelve el último valor de identidad generado por cualquier tabla en la sesión actual y el alcance de las actuales. Generalmente lo que usted desea utilizar.

  • IDENT_CURRENT('tableName') devuelve el último valor de identidad generado por una tabla específica en cualquier sesión y cualquier ámbito.Esto le permite especificar la tabla que desea que el valor de, en caso de que los dos de arriba no son exactamente lo que usted necesita (muy raro).También, como @Chico Starbuck mencionó, "Se podría usar si usted desea obtener el valor de IDENTIDAD actual de una tabla que no ha insertado un registro en."

  • El OUTPUT cláusula de la INSERT declaración te permitirá acceder a todos los de la fila que se inserta a través de esa declaración.Ya que es en el ámbito de la instrucción específica, es más sencillo de las otras funciones de la anterior.Sin embargo, es un poco más detallado (el que tendrás que insertar en una tabla variable/temp tabla y, a continuación, consulta) y da resultados incluso en un escenario de error cuando la declaración se revierte.Dicho esto, si su consulta utiliza un plan de ejecución en paralelo, este es el sólo método garantizado para la obtención de la identidad (corto de apagar el paralelismo).Sin embargo, se ejecuta antes de los desencadenantes y no puede ser usada para regresar a desencadenar los valores generados.

Otros consejos

Creo que la forma más segura y precisa método de recuperar el id insertado sería el uso de la cláusula output.

por ejemplo (tomado de la siguiente MSDN el artículo)

USE AdventureWorks2008R2;
GO
DECLARE @MyTableVar table( NewScrapReasonID smallint,
                           Name varchar(50),
                           ModifiedDate datetime);
INSERT Production.ScrapReason
    OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate
        INTO @MyTableVar
VALUES (N'Operator error', GETDATE());

--Display the result set of the table variable.
SELECT NewScrapReasonID, Name, ModifiedDate FROM @MyTableVar;
--Display the result set of the table.
SELECT ScrapReasonID, Name, ModifiedDate 
FROM Production.ScrapReason;
GO

Yo estoy diciendo lo mismo que los otros chicos, así que todo el mundo está en lo correcto, estoy tratando de hacerlo más claro.

@@IDENTITY devuelve el id de la última cosa que fue insertado por su conexión del cliente a la base de datos.
La mayoría de las veces esto funciona bien, pero a veces un desencadenador se vaya y se inserta una nueva fila que usted no sabe acerca de, y usted va a obtener el ID de esta nueva fila, en lugar de la que usted desee

SCOPE_IDENTITY() resuelve este problema.Devuelve el id de la última cosa que inserta en el código SQL has enviado a la base de datos.Si los desencadenadores ir y crear filas adicionales, que no causa el valor incorrecto para obtener devuelto.Hooray

IDENT_CURRENT devuelve el último ID que fue insertado por nadie.Si alguna otra aplicación que sucede para insertar otra fila en una unforunate tiempo, podrás obtener el ID de la fila en lugar de su uno.

Si quieres jugar a lo seguro, siempre uso SCOPE_IDENTITY().Si usted se pega con @@IDENTITY y alguien decide agregar un desencadenador más tarde, todo el código se va a romper.

La mejor (leer:más segura) de obtener la identidad de un recién fila insertada es mediante el uso de la output cláusula:

create table TableWithIdentity
           ( IdentityColumnName int identity(1, 1) not null primary key,
             ... )

-- type of this table's column must match the type of the
-- identity column of the table you'll be inserting into
declare @IdentityOutput table ( ID int )

insert TableWithIdentity
     ( ... )
output inserted.IdentityColumnName into @IdentityOutput
values
     ( ... )

select @IdentityValue = (select ID from @IdentityOutput)

Agregar

SELECT CAST(scope_identity() AS int);

al final de su insertar instrucción sql, entonces

NewId = command.ExecuteScalar()

va a recuperar.

MSDN

@@IDENTITY, SCOPE_IDENTITY, y IDENT_CURRENT son similares funciones en que se devuelve el último valor insertado en la columna de IDENTIDAD de una tabla.

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

IDENT_CURRENT no está limitado por el alcance y la sesión;se limita a una tabla especificada.IDENT_CURRENT devuelve el valor de identidad generado por una tabla específica en cualquier sesión y cualquier ámbito.Para obtener más información, consulte IDENT_CURRENT.

  • IDENT_CURRENT es una función que toma una tabla como un argumento.
  • @@IDENTITY puede volver confuso resultado cuando usted tiene un disparo en la tabla
  • SCOPE_IDENTITY es su héroe de la mayor parte del tiempo.

Cuando el uso de Entity Framework, que utiliza internamente el OUTPUT técnica para devolver el recién insertado IDENTIFICADOR de valor

DECLARE @generated_keys table([Id] uniqueidentifier)

INSERT INTO TurboEncabulators(StatorSlots)
OUTPUT inserted.TurboEncabulatorID INTO @generated_keys
VALUES('Malleable logarithmic casing');

SELECT t.[TurboEncabulatorID ]
FROM @generated_keys AS g 
   JOIN dbo.TurboEncabulators AS t 
   ON g.Id = t.TurboEncabulatorID 
WHERE @@ROWCOUNT > 0

La salida de resultados se almacenan en una tabla temporal variable, se unió de nuevo a la mesa, y devolver el valor de fila de la tabla.

Nota:No tengo idea de por qué EF sería inner join lo efímero de la tabla de vuelta a la mesa real (¿bajo qué circunstancias los dos no coinciden).

Pero eso es lo que EF no.

Esta técnica (OUTPUT) sólo está disponible en SQL Server 2008 o más reciente.

@@IDENTITY es el último de identidad insertado el uso de la corriente de Conexión de SQL.Este es un buen valor para volver a partir de un procedimiento almacenado insert, donde sólo tiene la identidad insertado para su nuevo registro, y no me importa si hay más filas que se han añadido después.

SCOPE_IDENTITY es el último de identidad insertado el uso de la corriente de Conexión de SQL, y en el ámbito actual, es decir, si hubo un segundo de IDENTIDAD insertado basado en un disparo después de su inserción, lo que no se refleja en SCOPE_IDENTITY, sólo la pieza que realiza.Francamente, nunca he tenido una razón para usar este.

IDENT_CURRENT(tablename) es el último de identidad insertado independientemente de la conexión o alcance.Puedes utilizar esta función si desea obtener el valor de IDENTIDAD actual de una tabla que no ha insertado un registro en.

No puedo hablar por otras versiones de SQL Server, pero en el 2012, mostrando directamente funciona bien.Usted no tiene que molestarse con una tabla temporal.

INSERT INTO MyTable
OUTPUT INSERTED.ID
VALUES (...)

Por cierto, esta técnica también funciona a la hora de insertar varias filas.

INSERT INTO MyTable
OUTPUT INSERTED.ID
VALUES
    (...),
    (...),
    (...)

Salida

ID
2
3
4

SIEMPRE uso scope_identity(), NUNCA hay una necesidad para cualquier otra cosa.

Después de Su Instrucción Insert necesita agregar este.Y asegurarse de que sobre el nombre de la tabla de datos donde se va a insertar.Usted recibirá de la fila actual en ninguna fila afectada ahora por su instrucción insert.

IDENT_CURRENT('tableName')

Si usted está buscando la última ID añadido/actualizado, esto puede ser un poco de la vieja escuela, pero hay un montón de personas que utilizan mayores PHP, Pre 5.5 para ser más precisos.Más detalles se pueden encontrar en http://php.net/manual/en/function.mysql-insert-id.php

$last = mysql_insert_id();

Crear un uuid y también inserta una columna.Entonces usted puede identificar fácilmente su fila con el uuid.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top