Proč to vůbec děláte ve více prohlášeních? Proč ne:
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);
Nyní musíte zavolat pouze jeden ExecuteNonQuery()
a vaše aplikace se nemusí zajímat o skutečný SCOPE_IDENTITY()
generovaná hodnota. (Stále můžete načíst SCOPE_IDENTITY()
pokud chcete, samozřejmě pomocí ExecuteScalar
- ale jak Nenad správně podotýká, vyberte si jednoho místo volání oběma.)
Vzhledem k tomu, že nyní víme, že zde existuje explicitní cizí klíč, můžeme stále redukovat váš kód C# na jedno volání, i když nemůžeme použít OUTPUT
doložka.
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
Ještě čistší by bylo vložit to do uložené procedury.