0

我知道在 T-SQL (Server 2008 R2) 中,我可以使用“输出”关键字来获取我刚刚插入的行的 ID。例如,我可以做

insert into [Membership].[dbo].[User] (EmailAddress) 
output Inserted.UserId 
values('testUser1@test.com')

有没有办法将它组合成另一个插入?例如,假设我想添加一个新用户并立即将该用户添加到一个UserRole映射UserIdRoleId.

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

insert into UserRole (RoleId, UserId) 
values 
(
    1, 
    insert into [Membership].[dbo].[User] (EmailAddress) 
    output Inserted.UserId values('testUser1@test.com')
)

但我似乎无法让它发挥作用。我尝试将内部插入包裹在括号 () 中或使用 select * from () 等。

我错过了什么?这种组合甚至可能吗?

谢谢您的帮助。

问候,

4

2 回答 2

2

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

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

您还可以将OUTPUT子句直接导入目标表 - 如果您可以为您的 使用固定值,这将起作用RoleID

DECLARE @FixedRoleID INT = 42

INSERT INTO [Membership].[dbo].[User] (EmailAddress) 
OUTPUT @FixedRoleID, Inserted.UserId INTO dbo.UserRole(RoleId, UserId)
VALUES ('testUser1@test.com')
于 2012-08-24T05:31:54.930 回答
0

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

http://msdn.microsoft.com/en-us/library/ms189799.aspx

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

为 | AFTER AFTER 指定仅当触发 SQL 语句中指定的所有操作都已成功执行时才触发 DML 触发器。在触发此触发器之前,所有引用级联操作和约束检查也必须成功。

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

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

于 2012-08-24T08:09:03.417 回答