将多个记录插入视图时,tsql返回标识值

时间:2012-05-29 10:27:30

标签: sql-server tsql triggers identity

我有一种情况需要在视图中插入多个记录/批量插入而不是触发器。如何检索插入的标识值?我尝试使用OUTPUT子句从Inserted表中检索Id,但它总是返回null。

1 个答案:

答案 0 :(得分:1)

使用此设置。

create table InsteadOf
(
  ID int identity primary key,
  Name varchar(10) not null
)

go

create view v_InsteadOf
as
select ID, Name
from InsteadOf

go

create trigger tr_InsteadOf on InsteadOf instead of insert
as
begin
  insert into InsteadOf(Name)
  select Name
  from inserted
end

声明

insert into v_InsteadOf(Name)
output inserted.*
select 'Name1' union all 
select 'Name2'

会给你一个错误。

  

Msg 334,Level 16,State 1,Line 4目标表'替代'的   如果语句,DML语句不能有任何启用的触发器   包含没有INTO子句的OUTPUT子句。

使用带插入的INTO子句。

declare @IDs table(ID int, Name varchar(10))

insert into v_InsteadOf(Name)
output inserted.* into @IDs
select 'Name1' union all 
select 'Name2'

select *
from @IDs

0视为非null的值。

ID          Name
----------- ----------
0           Name1
0           Name2

您可以将输出子句放在触发器中。

create trigger tr_InsteadOf on InsteadOf instead of insert
as
begin
  insert into InsteadOf(Name)
  output inserted.*
  select Name
  from inserted
end

当您执行插入操作时,将为您生成输出。

insert into v_InsteadOf(Name)
select 'Name1' union all 
select 'Name2'

结果:

ID          Name
----------- ----------
1           Name1
2           Name2

<强>更新
要捕获insert语句的输出,可以使用insert into ... exec (...)

declare @T table
(
  ID int,
  Name varchar(10)
)

insert into @T
exec
  (
    'insert into v_InsteadOf(Name)
     values (''Name1''),(''Name2'')'
  )