如何使用最后插入的ID将行插入另一个表?

Dev*_*rof 5 sql sql-server

我有两个表我的SQL服务器GamerNameGamerValues我想的是,当我insert在一个新行GamerName

 GamerName

    ????????????????
    ? ID ?  Name   ?
    ????????????????
    ?  1 ? Jeff    ?
    ?  2 ? Geoff   ?
    ?  3 ? Jarrod  ?
    ?  4 ? Joel Sp ?
    ????????????????
Run Code Online (Sandbox Code Playgroud)

因此,使用insertedtable 上的最后一个ID GamerName,应填写值GamerValues

 GamerValues

??????????????????????????????
? ID ?  GamerID     ? Score  ?
??????????????????????????????
?  1 ? 1            ? 5636   ?
?  2 ? 2            ?  148   ?
?  3 ? 3            ?  101   ?
?  4 ? 4            ?  959   ?
??????????????????????????????
Run Code Online (Sandbox Code Playgroud)

是否可以通过单个查询来完成?

Pan*_*vos 8

您不需要触发器或任何@@IDENTITY,SCOPE_IDENTITY()函数。它们都有限制,并且都不能处理不是由IDENTITY约束产生的值。它们也都不能处理多次插入。

您可以使用的OUTPUT子句INSERT将新插入的值复制到另一个表或表变量中。

输出也可用于更新和删除。您可以使用inserted.deleted.前缀检索新的/修改的列

对于这些表:

create table #GamerName 
(
    ID int IDENTITY primary key, 
    Name nvarchar(20) not null
);
create table #GamerValues(
    ID int IDENTITY primary key,
    GamerID int not null,
    Score int not null
);
Run Code Online (Sandbox Code Playgroud)

您可以插入新记录#GamerName并将生成的 ID 复制到#GamerValues

INSERT INTO #GamerName (Name)
OUTPUT inserted.ID,0 into #GamerValues(GamerID,Score)
VALUES 
('Jeff'),
('Geoff'),
('Jarrod'),
Run Code Online (Sandbox Code Playgroud)

新值出现在inserted虚拟表中。输出也可用

将为 GamerValues 中的每个玩家创建一条新行。让我们修改默认分数:

UPDATE #GamerValues 
SET Score=100
Run Code Online (Sandbox Code Playgroud)

该表将如下所示:

ID  GamerID Score
1   1       100
2   2       100
3   3       100
Run Code Online (Sandbox Code Playgroud)

添加另一个玩家

insert into #GamerName (Name)
output inserted.ID,0 into #GamerValues(GamerID,Score)
Values 
('Joel sp')
Run Code Online (Sandbox Code Playgroud)

将产生得分为 0 的新行

ID  GamerID Score
1   1       100
2   2       100
3   3       100
4   4       0
Run Code Online (Sandbox Code Playgroud)