scope_identity ident_current ejemplo sql-server sql-server-2005

sql-server - ident_current - select @@identity sql server



¿Cómo puede SCOPE_IDENTITY devolver un valor nulo cuando @@ IDENTITY no lo hace? (4)

Después de ejecutar una inserción, selecciono SCOPE_IDENTITY o @@IDENTITY .

SCOPE_IDENTITY devuelve null, pero @@IDENTITY no lo hace.

No entiendo cómo esto es posible.

¿Puedes pensar en una razón por la que esto sucede?


Aquí hay un ejemplo de cómo SCOPE_IDENTITY () será nulo pero @@ IDENTITY tendrá un valor:

insertar en una tabla sin identidad, esa tabla tiene un desencadenador de inserción que luego se inserta en una tabla de historial con una identidad. SCOPE_IDENTITY () será nulo (no hay identidad en el ámbito local), pero @@ IDENTITY informará la identidad desde el activador.

Para su información, hay un error conocido con SCOPE_IDENTITY (): https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=328811

Lo mejor que puedes hacer con las identidades es utilizar SALIDA EN, puede capturar un conjunto de ID y no está sujeto al error SCOPE_IDENTITY ():

declare @x table (tableID int identity not null primary key, datavalue varchar(10)) declare @y table (tableID int, datavalue varchar(10)) INSERT INTO @x values (''aaaa'') INSERT INTO @x values (''bbbb'') INSERT INTO @x values (''cccc'') INSERT INTO @x values (''dddd'') INSERT INTO @x values (''eeee'') INSERT INTO @x (datavalue) OUTPUT INSERTED.tableID, INSERTED.datavalue --<<<<OUTPUT INTO SYNTAX INTO @y --<<<<OUTPUT INTO SYNTAX SELECT ''value=''+CONVERT(varchar(5),dt.NewValue) FROM (SELECT id as NewValue from sysobjects where id<20) dt ORDER BY dt.NewValue select * from @x select * from @y


Encontré esto en MSDN:

La función SCOPE_IDENTITY () devolverá el valor nulo si la función se invoca antes de que ocurra cualquier instrucción INSERT en una columna de identidad en el ámbito.

Puede leer aquí: http://msdn.microsoft.com/en-us/library/ms190315.aspx

Su código SQL sería muy útil.


KM golpeó el clavo en la cabeza:

  • @@IDENTITY le proporciona el último valor de IDENTIDAD insertado, no importa en qué lugar se insertó la tabla (piense en los activadores , por ejemplo, en las tablas de auditoría. O incluso en una cascada de activadores ...)

  • SCOPE_IDENTITY() le da la última IDENTIDAD insertada en el alcance de su declaración, por ejemplo, en la (s) tabla (s) a la que hizo referencia su propia declaración real (no las que pudieron haber sido tocadas por un disparador)


SCOPE_IDENTITY también devolverá NULL cuando la inserción sea por sp_executesql ya que ya no está en el alcance de INSERT!