我有一个2表,其中一个表与另一个表有外键关系
CREATE TABLE foo (
id INT NOT NULL PRIMARY KEY IDENTITY,
value VARCHAR(50) DEFAULT NULL,
);
CREATE TABLE bar (
id INT NOT NULL PRIMARY KEY IDENTITY,
foo_key INT NOT NULL
value VARCHAR(50) DEFAULT NULL,
);
我正在使用参数化的ADO.NET ExecuteReader来插入新行。我的腌菜是,如果我想在同一个事务中的不同表中插入2行,即在提交之前,我不能在bar中插入行,因为我不知道已经赋予foo.id的值。你会怎么做呢?即如何确保为bar.foo_key分配正确的值?试图选择它什么都没带来,因为我猜它实际上还没有。我是否应该使用存储过程来动态尝试生成密钥,或者可能存在可以使用的内部变量。或者有没有办法让插入返回新的ID?我是否需要外键声明,但我不确定它是否有用,因为我仍然不知道使用什么ID?
我想一次性完成的原因是由于错误处理,我希望能够在出现错误时将所有内容都回滚。
答案 0 :(得分:5)
您可以使用scope_identity()
检索新生成的identity
:
begin tran;
insert Foo (value) values ('6*7');
declare @fk int = scope_identity();
insert bar (foo_key, value) values (@fk, '42');
commit tran;
根据HLGEM的评论,要将新生成的身份的值返回给客户,您可以使用output
:
insert Foo (value) output inserted.ID values ('6*7');
请注意,对于跨越两个会话的事务,您需要一个非常昂贵的分布式事务。
答案 1 :(得分:0)
我发现我可以在插入
上返回scope_identity()INSERT INTO [foo] ([value]) VALUES (@0) SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];