トリガーの代わりにビューに複数のレコード/バッチ挿入を挿入する必要がある状況があります。挿入された ID 値を取得するにはどうすればよいですか? OUTPUT 句を使用して、挿入されたテーブルから Id を取得しようとしましたが、常に null が返されます。
質問する
1612 次
1 に答える
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'
エラーが発生します。
メッセージ 334、レベル 16、状態 1、行 4 ステートメントに INTO 句のない OUTPUT 句が含まれている場合、DML ステートメントのターゲット テーブル 'InsteadOf' は、有効なトリガーを持つことはできません。
代わりに挿入で 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
あなたを値 not として与えます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 into ... exec (...)
declare @T table
(
ID int,
Name varchar(10)
)
insert into @T
exec
(
'insert into v_InsteadOf(Name)
values (''Name1''),(''Name2'')'
)
于 2012-05-29T12:33:02.743 に答える