Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL - INSERT avec Scope_Identity() - obtenir l'identifiant de l'enregistrement

Pourquoi faites-vous cela dans plusieurs déclarations en premier lieu ? Pourquoi pas :

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

Maintenant, vous n'avez qu'à appeler un seul ExecuteNonQuery() et votre application n'a pas à se soucier du SCOPE_IDENTITY() valeur générée. (Vous pouvez toujours récupérer SCOPE_IDENTITY() si vous voulez, bien sûr, en utilisant ExecuteScalar - mais comme le souligne à juste titre Nenad, choisissez-en un au lieu d'appeler les deux.)

Puisque nous savons maintenant qu'il y a une clé étrangère explicite ici, nous pouvons toujours réduire votre code C# à un seul appel même si nous ne pouvons pas utiliser le OUTPUT clause.

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

Ce serait encore plus propre de mettre cela dans une procédure stockée.