2010-10-12 113 views

Respuesta

11
SELECT SCOPE_IDENTITY() 

Utilice esta después de la instrucción de inserción y que le devuelva la identidad del insertada en su ámbito de aplicación. Puede asignar esto a la variable o devolverlo en un parámetro de salida.

+0

¿Qué es un alcance? 2 hilos son diferentes ámbitos? –

+0

sí lo son. compruebe http://msdn.microsoft.com/en-us/library/ms190315.aspx para obtener documentación detallada sobre SCOPE_IDENTITY – Numenor

+0

cómo difiere SCOPE_IDENTITY() de @@ identity, SCOPE_IDENTITY() devuelve @@ identity ... y en mi respuesta, he devuelto la identidad @@ después de la inserción ... – RameshVel

0

Creo que puede escribir un proceso almacenado que tiene un parámetro de entrada/salida, y luego tomar el valor del parámetro.

2

probar este

@@identity 

debajo del código de ejemplo

strSQL = "INSERT INTO tablename (name) VALUES (@name);SELECT @@Identity" 
SQLCommand.CommandText = strSQL 
Id = SQLCommand.ExecuteScalar() 
+0

esto no será de subprocesos. – Numenor

+0

@Numenor, ¿Cómo esto no es seguro para hilos ...? – RameshVel

+0

@Numenor - ¿De qué estás hablando?Eso es perfectamente seguro para los subprocesos, ya que ambos comandos se están ejecutando en una sola consulta. –

3

Debe usar Scope_Identity() para este escenario. Esto devolverá la identidad para el alcance actual. @@Identity devuelve la última identidad insertada.

Tome un vistazo a Scope Identity on MSDN - hay ejemplos de cómo se @@Identity devolver valores incorrectos en comparación con el uso de Scope_Identity

2

Un método de implementación alternativa es utilizar el OUTPUT cláusula del lenguaje T-SQL.

Por ejemplo:

create table #tmpTable 
(
    ID int identity(1,1) not null primary key, 
    SomeValue varchar(20) not null 
); 

insert #tmpTable 
output INSERTED.ID 
values('SomeTextData') 

drop table #tmpTable; 

Desde una perspectiva general de diseño de soluciones que estaría a favor de que se mira para envolver su lógica de inserción en un procedimiento almacenado (volviendo el ID de registro insertado) que llama desde su código fuente de la aplicación .

0

Estoy bastante seguro de que querrá usar el método ObjectContext.ExecuteStoreQuery si necesita el valor de identidad, en lugar de ObjectContext.ExecuteStoreCommand.

Usted tendrá que utilizar, como otros han mencionado SCOPE_IDENTITY(), en lugar de @@IDENTITY como SCOPE_IDENTITY() devuelve el valor de identidad para el ámbito de ejecución currente wheras @@IDENTITY "es una función del sistema que devuelve el último valor de identidad insertado."

Algo como esto debe hacer el truco:

using(var context = GetAContextThatsReadyToUse()) 
{ 
    var valueForColumn1 = 5; 
    var result = ExecuteStoreQuery<int>("INSERT INTO table1 (Column1) VALUES ({0});SELECT SCOPE_IDENTITY()", valueForColumn1); 

    foreach(var item in result) 
    { 
     // Should only return one result, which is the identity value inserted by ExecuteStoreQuery 
     Console.WriteLine(item); 
    } 
} 
0

que tenía gran cantidad de situaciones en las que algo así como 100 procesos estuviera escribiendo en una mesa a la vez. No usé SCOPE_IDENTITY(), pero estaba envolviendo toda la inserción/identificación en una transacción, y no hubo ningún problema con ese enfoque.

Cuestiones relacionadas