Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL - INSERT с Scope_Identity() - получаване на идентификатора на записа

Защо правите това в множество изявления на първо място? Защо не:

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

Сега трябва да извикате само един ExecuteNonQuery() и приложението ви не трябва да се интересува от действителния SCOPE_IDENTITY() генерирана стойност. (Все още можете да извлечете SCOPE_IDENTITY() ако искате, разбира се, с помощта на ExecuteScalar - но както Ненад правилно отбелязва, изберете един, вместо да плащате и на двата.)

Тъй като вече знаем, че тук има изричен външен ключ, пак можем да намалим вашия C# код до едно извикване, дори ако не можем да използваме OUTPUT клауза.

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

Би било още по-чисто да поставите това в съхранена процедура.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да постигна този вид репликация?

  2. Как да премахнете бели интервали от низ в SQL Server

  3. Подреждане по година, месец заедно с кумулативната сума

  4. SQL Server *=Оператор?

  5. Преобразувайте smallint във време