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

SQL - INSERT med Scope_Identity() - henter post-id'et

Hvorfor gør du dette i flere udsagn i første omgang? Hvorfor ikke:

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 skal du kun kalde én ExecuteNonQuery() og din app behøver ikke at bekymre sig om den faktiske SCOPE_IDENTITY() genereret værdi. (Du kan stadig hente SCOPE_IDENTITY() hvis du selvfølgelig vil bruge ExecuteScalar - men som Nenad rigtigt påpeger, vælg en i stedet for at kalde begge.)

Da vi nu ved, at der er en eksplicit fremmednøgle her, kan vi stadig reducere din C#-kode til ét opkald, selvom vi ikke kan bruge 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

Ville være endnu renere at sætte dette ind i en lagret procedure.



  1. SQL-injektioner med erstatning af enkeltanførselstegn og valider heltal

  2. Hvordan trækker jeg ved brug af SQL i MYSQL mellem to dato-tidsværdier og henter resultatet i minutter eller sekunder?

  3. MySQL TINYINT som usigneret

  4. Opret en MySQL-lagret funktion med et dynamisk antal argumenter