sql >> Databáze >  >> RDS >> Sqlserver

SQL - INSERT s Scope_Identity() - získání ID záznamu

Proč to vůbec děláte ve více prohlášeních? Proč ne:

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

Nyní musíte zavolat pouze jeden ExecuteNonQuery() a vaše aplikace se nemusí zajímat o skutečný SCOPE_IDENTITY() generovaná hodnota. (Stále můžete načíst SCOPE_IDENTITY() pokud chcete, samozřejmě pomocí ExecuteScalar - ale jak Nenad správně podotýká, vyberte si jednoho místo volání oběma.)

Vzhledem k tomu, že nyní víme, že zde existuje explicitní cizí klíč, můžeme stále redukovat váš kód C# na jedno volání, i když nemůžeme použít OUTPUT doložka.

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

Ještě čistší by bylo vložit to do uložené procedury.



  1. Django+Postgres:aktuální transakce je přerušena, příkazy ignorovány až do konce bloku transakce

  2. chyba 1064 (42000) při pokusu o provedení příkazu mysqldump

  3. Aktualizujte sloupec tabulky Oracle číslem řádku

  4. SQL prevence duplicitních záznamů, pokud existují 2 hodnoty