sql >> Base de Datos >  >> RDS >> Sqlserver

SQL - INSERTAR con Scope_Identity () - obtener la identificación del registro

¿Por qué estás haciendo esto en múltiples declaraciones en primer lugar? Por qué no:

INSERT dbo.Items (item_name,  item_cost, item_code) 
  OUTPUT inserted.ItemID, @ProjectID, @ItemQuantity 
  INTO dbo.project_items(item_id, project_id, item_quantity)
VALUES (@ItemName, @ItemCost, @ItemCode);

Ahora solo tienes que llamar a un ExecuteNonQuery() y su aplicación no tiene que preocuparse por el SCOPE_IDENTITY() valor generado. (Aún puede recuperar SCOPE_IDENTITY() si quieres, por supuesto, usando ExecuteScalar - pero como Nenad señala acertadamente, elija uno en lugar de llamar a ambos).

Como ahora sabemos que aquí hay una clave externa explícita, aún podemos reducir su código C# a una sola llamada, incluso si no podemos usar OUTPUT cláusula.

DECLARE @i INT;

INSERT dbo.Items (item_name,  item_cost, item_code) 
  SELECT @ItemName, @ItemCost, @ItemCode;

SELECT @i = SCOPE_IDENTITY();

INSERT dbo.project_items(item_id, project_id, item_quantity)
  SELECT @i, @ProjectID, @ItemQuantity 

SELECT @i; -- if necessary

Sería aún más limpio poner esto en un procedimiento almacenado.