使用上一个插入的 ID 插入

Tsc*_*eck 0 sql sql-server sql-insert

我有表 A 和表 B 具有多对多关系。表AB是链接表。

Table:  Columns:
A       { Id, Name }
AB      { A_Id, B_Id }
B       { Id, Name }
Run Code Online (Sandbox Code Playgroud)

我想将行插入到表 A 中,然后使用该行的 Id(Id 具有自动递增的标识)插入到链接表中。

是否可以在单个 SQL 命令中执行此操作?

示例(伪sql):

insert into A (Name) values (@name)
insert into AB (A_Id, B_Id) values ([previous id], @b_Id)
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 5

在SQL Server中,要做到这一点的最安全的方法是使用output条款,这说明在这里

declare @ids table (id int);

insert into A (Name)
    output inserted.id into @ids
    values (@name);

insert into AB (A_Id, B_Id) 
    select i.id, @b_Id
    from @ids i;
Run Code Online (Sandbox Code Playgroud)

为什么output更安全?首先,它不依赖于事务或会话语义。它只是捕获实际插入的数据并使其可用于后续语句。

其次,它可以处理插入的多行(尽管在这种情况下这不是问题)。

第三,它可以返回除 id 之外的其他列,这很方便。