Tsql 将SQL insert语句组合到另一个insert语句中
我知道在T-SQL(Server2008R2)中,我可以使用“Output”关键字来获取刚刚插入的行的Id。例如,我能做什么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 基本上,我想做下面
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触发器
我知道我可以使用临时表,但我想看看是否有一种方法可以将它从一个查询组合到另一个查询,而无需任何中间存储。看起来你的最后一个选择就是这样。