Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL - INSERT z Scope_Identity() - pobieranie identyfikatora rekordu

Dlaczego robisz to w wielu wypowiedziach? Dlaczego nie:

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

Teraz wystarczy wywołać tylko jedną funkcję ExecuteNonQuery() a Twoja aplikacja nie musi dbać o faktycznie SCOPE_IDENTITY() wygenerowana wartość. (Nadal możesz pobrać SCOPE_IDENTITY() jeśli chcesz oczywiście użyć ExecuteScalar - ale jak słusznie zauważa Nenad, wybierz jedno zamiast dzwonić do obu.)

Ponieważ teraz wiemy, że istnieje tutaj jawny klucz obcy, nadal możemy zredukować kod C# do jednego wywołania, nawet jeśli nie możemy użyć OUTPUT klauzula.

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

Jeszcze czystsze byłoby umieszczenie tego w procedurze składowanej.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 4 niesamowite zasoby monitorowania SQL Server dla administratorów baz danych

  2. Czy mogę włączyć ignorowanie_dup_key dla klucza podstawowego?

  3. C# Odszyfruj bajty z programu SQL Server EncryptByPassPhrase?

  4. Odniesienie Procedury składowane dla wszystkich baz danych na serwerze

  5. Dowiedz się, czy obiekt jest funkcją wartościującą tabelę w SQL Server za pomocą OBJECTPROPERTY()