sql >> Database >  >> RDS >> Sqlserver

SQL - INSERT met Scope_Identity() - de record-id ophalen

Waarom doe je dit in de eerste plaats in meerdere verklaringen? Waarom niet:

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 hoeft u slechts één ExecuteNonQuery() . aan te roepen en uw app hoeft zich geen zorgen te maken over de eigenlijke SCOPE_IDENTITY() waarde gegenereerd. (Je kunt nog steeds SCOPE_IDENTITY() ophalen als je wilt, natuurlijk, gebruik makend van ExecuteScalar - maar zoals Nenad terecht opmerkt, kies er een in plaats van beide te bellen.)

Aangezien we nu weten dat hier een expliciete externe sleutel is, kunnen we uw C#-code nog steeds terugbrengen tot één aanroep, zelfs als we de OUTPUT niet kunnen gebruiken clausule.

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

Het zou nog schoner zijn om dit in een opgeslagen procedure te stoppen.



  1. MariaDB ROW_COUNT() uitgelegd

  2. MYSQL tijdzone instellen in PHP-code

  3. Hoe kunnen we SQL-Injection van MySQL voorkomen?

  4. MYSQL combineert weergave van twee tabellen met een verschillend aantal invoerrecords