Tại sao bạn làm điều này trong nhiều câu lệnh ngay từ đầu? Tại sao không:
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);
Bây giờ bạn chỉ phải gọi một ExecuteNonQuery()
và ứng dụng của bạn không phải quan tâm đến SCOPE_IDENTITY()
thực sự giá trị được tạo ra. (Bạn vẫn có thể truy xuất SCOPE_IDENTITY()
tất nhiên nếu bạn muốn, hãy sử dụng ExecuteScalar
- nhưng như Nenad đã chỉ ra một cách đúng đắn, hãy chọn một thay vì gọi cả hai.)
Vì bây giờ chúng tôi biết rằng có một khóa ngoại rõ ràng ở đây, chúng tôi vẫn có thể giảm mã C # của bạn thành một cuộc gọi ngay cả khi chúng tôi không thể sử dụng OUTPUT
mệnh đề.
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
Sẽ gọn gàng hơn nữa nếu đưa điều này vào một quy trình được lưu trữ.