sql >> Databasteknik >  >> RDS >> Sqlserver

SQL - INSERT med Scope_Identity() - hämtar post-id

Varför gör du detta i flera påståenden i första hand? Varför inte:

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

Nu behöver du bara anropa en ExecuteNonQuery() och din app behöver inte bry sig om den faktiska SCOPE_IDENTITY() värde genererat. (Du kan fortfarande hämta SCOPE_IDENTITY() om du vill, naturligtvis, använda ExecuteScalar - men som Nenad helt riktigt påpekar, välj en istället för att ringa båda.)

Eftersom vi nu vet att det finns en explicit främmande nyckel här, kan vi fortfarande reducera din C#-kod till ett anrop även om vi inte kan använda OUTPUT klausul.

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

Skulle vara ännu renare att lägga detta i en lagrad procedur.



  1. Hitta alla skärningspunkter för alla uppsättningar av intervall i PostgreSQL

  2. SQLException :Sträng eller binär data skulle trunkeras

  3. Bästa sättet att förvara ett SET större än 64

  4. Codeigniter tidszon mysql inställningar