Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL - INSERT com Scope_Identity() - obtendo o ID do registro


Por que você está fazendo isso em várias declarações em primeiro lugar? Por que não:
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);

Agora você só precisa chamar um ExecuteNonQuery() e seu aplicativo não precisa se preocupar com o realmente SCOPE_IDENTITY() valor gerado. (Você ainda pode recuperar SCOPE_IDENTITY() se você quiser, é claro, usando ExecuteScalar - mas como Nenad aponta corretamente, escolha um em vez de chamar os dois.)

Como agora sabemos que há uma chave estrangeira explícita aqui, ainda podemos reduzir seu código C# para uma chamada, mesmo que não possamos usar o OUTPUT cláusula.
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

Seria ainda mais limpo colocar isso em um procedimento armazenado.