我有2个表,第一个表包含该项目的次要详细信息,第二个表包含其余信息。
BEGIN TRANSACTION;
INSERT INTO Items (Name, CategoryId)
VALUES ('My Tv', 5);
INSERT INTO CharsToItem (ItemId, Value)
VALUES ((SELECT Id FROM Items WHERE Id = @@Identity;), '65 Inch');
INSERT INTO CharsToItem (ItemId, Value)
VALUES ((SELECT Id FROM Items WHERE Id = @@Identity;), '3840x2160');
COMMIT;
第一次插入CharToItem
表时,一切工作正常,第二次返回返回值是NULL,我无法将其插入数据库。
是否可以将ID保存在选择中并多次使用?
答案 0 :(得分:2)
在第一次插入CharsToItem
表中之后,@@Identity
返回CharsToItem
中新插入的项目的ID。
因此,在插入Items
后,请将ID存储在变量中
DECLARE @itemId int -- Variable to store the last ItemId.
BEGIN TRANSACTION;
INSERT INTO Items (Name, CategoryId) VALUES ('My Tv', 5);
SET @itemId = SCOPE_IDENTITY(); -- Store the new ItemId
INSERT INTO CharsToItem (ItemId, Value) VALUES (@itemId, '65 Inch');
INSERT INTO CharsToItem (ItemId, Value) VALUES (@itemId, '3840x2160');
COMMIT;
请注意,您不必从某些内容中选择最后一个ID,@@IDENTITY
或SCOPE_IDENTITY()
已经返回了最后一个ID。
还请注意,SCOPE_IDENTITY()
比@@IDENTITY
更安全,例如,@@IDENTITY
可以返回由触发器创建的ID。
请参阅this answer,以解决这个问题:scope_identity vs ident_current。
答案 1 :(得分:1)
DECLARE @ItemId int;
BEGIN TRANSACTION;
INSERT INTO Items (Name, CategoryId) VALUES ('My Tv', 5);
SET @ItemId = scope_identity();
INSERT INTO CharsToItem (ItemId, Value) VALUES (@ItemId, '65 Inch');
INSERT INTO CharsToItem (ItemId, Value) VALUES (@ItemId, '3840x2160');
COMMIT;