Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL - INSERT con Scope_Identity() - ottenendo l'ID del record

Perché lo stai facendo in più affermazioni in primo luogo? Perché 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);

Ora devi solo chiamare un ExecuteNonQuery() e la tua app non deve preoccuparsi dell'effettivo SCOPE_IDENTITY() valore generato. (Puoi comunque recuperare SCOPE_IDENTITY() se vuoi, ovviamente, usando ExecuteScalar - ma come fa giustamente notare Nenad, scegline uno invece di chiamarli entrambi.)

Poiché ora sappiamo che c'è una chiave esterna esplicita qui, possiamo comunque ridurre il tuo codice C# a una chiamata anche se non possiamo usare OUTPUT clausola.

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

Sarebbe ancora più pulito inserirlo in una procedura memorizzata.