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