Tsql 将SQL insert语句组合到另一个insert语句中

Tsql 将SQL insert语句组合到另一个insert语句中,tsql,sql-server-2008-r2,Tsql,Sql Server 2008 R2,我知道在T-SQL(Server2008R2)中,我可以使用“Output”关键字来获取刚刚插入的行的Id。例如,我能做什么 insert into [Membership].[dbo].[User] (EmailAddress) output Inserted.UserId values('testUser1@test.com') 有没有办法把它编成另一个插页?例如,假设我想添加一个新用户,并立即将该用户添加到UserRole表中,该表将UserId映射到RoleId 基本上,我想做下面

我知道在T-SQL(Server2008R2)中,我可以使用“Output”关键字来获取刚刚插入的行的Id。例如,我能做什么

insert into [Membership].[dbo].[User] (EmailAddress) 
output Inserted.UserId 
values('testUser1@test.com')
有没有办法把它编成另一个插页?例如,假设我想添加一个新用户,并立即将该用户添加到
UserRole
表中,该表将
UserId
映射到
RoleId

基本上,我想做下面的事情

insert into UserRole (RoleId, UserId) 
values 
(
    1, 
    insert into [Membership].[dbo].[User] (EmailAddress) 
    output Inserted.UserId values('testUser1@test.com')
)
但我似乎没法让它发挥作用。我试着用括号()或select*from()等将内部插件包装起来

我错过了什么?这篇作文可能吗

谢谢你的帮助


关于,

您必须将输出捕获到表变量中:

DECLARE @TempVar TABLE (UserID INT)

insert into [Membership].[dbo].[User] (EmailAddress) 
output Inserted.UserId INTO @TempVar(UserID)
values('testUser1@test.com')
然后在第二步中,从该临时表插入目标表:

INSERT INTO dbo.UserRole (RoleId, UserId) 
   SELECT 
      (yourRoleId), tv.UserID
   FROM @TempVar tv
您还可以将
输出
子句直接导入目标表-如果您可以,例如,为
角色ID使用固定值,这将起作用:

DECLARE @FixedRoleID INT = 42

INSERT INTO [Membership].[dbo].[User] (EmailAddress) 
OUTPUT @FixedRoleID, Inserted.UserId INTO dbo.UserRole(RoleId, UserId)
VALUES ('testUser1@test.com')

另一种解决方案是使用触发器:

并注意“之后”插入触发器:

FOR | AFTER指定仅当 触发SQL语句中指定的所有操作都已执行 成功地所有引用级联操作和约束检查 也必须在触发之前成功

当FOR是唯一指定的关键字时,AFTER是默认值

不能在视图上定义AFTER触发器


我知道我可以使用临时表,但我想看看是否有一种方法可以将它从一个查询组合到另一个查询,而无需任何中间存储。看起来你的最后一个选择就是这样。