Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL - INSERT mit Scope_Identity() - Abrufen der Datensatz-ID

Warum machst du das überhaupt in mehreren Anweisungen? Warum nicht:

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);

Jetzt müssen Sie nur noch ein ExecuteNonQuery() aufrufen und Ihre App muss sich nicht um die eigentliche SCOPE_IDENTITY() kümmern Wert generiert. (Sie können immer noch SCOPE_IDENTITY() abrufen wenn Sie möchten, natürlich mit ExecuteScalar - aber wie Nenad zu Recht betont, wählen Sie eine aus, anstatt beide anzurufen.)

Da wir jetzt wissen, dass es hier einen expliziten Fremdschlüssel gibt, können wir Ihren C#-Code immer noch auf einen Aufruf reduzieren, auch wenn wir den OUTPUT nicht verwenden können Klausel.

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

Noch sauberer wäre es, dies in eine gespeicherte Prozedur zu packen.