agg*_*ton 5 sql sql-server ado.net
我有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,
);
Run Code Online (Sandbox Code Playgroud)
我正在使用参数化的ADO.NET ExecuteReader插入新行。我的泡菜是,如果我想在同一事务中的不同表中插入2行,即在提交之前,我不能在bar中插入行,因为我还不知道给定foo.id的值。您将如何去做?即我如何确保为bar.foo_key分配正确的值?尝试选择它不会带来任何好处,因为我猜它实际上还没有出现。我应该使用存储过程来尝试动态生成密钥,还是应该使用内部变量。还是有办法让插入返回新的ID?我不确定是否需要外键声明,因为我仍然不知道使用什么ID,我不确定这是否有用?
之所以要一次性执行该操作,是因为要进行错误处理,因此我希望能够在发生错误的情况下将所有内容回滚。
您可以使用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;
Run Code Online (Sandbox Code Playgroud)
根据HLGEM的评论,要将新生成的身份的值返回给客户端,可以使用output:
insert Foo (value) output inserted.ID values ('6*7');
Run Code Online (Sandbox Code Playgroud)
请注意,要使一个事务跨越两个会话,就需要一个分布式事务,这非常昂贵。
| 归档时间: |
|
| 查看次数: |
4218 次 |
| 最近记录: |