SQL-事务在事务内部获取自动增量值

时间:2019-03-10 16:18:59

标签: sql sql-server sqltransaction

我有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保存在选择中并多次使用?

2 个答案:

答案 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,@@IDENTITYSCOPE_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;