1

トリガーの代わりにビューに複数のレコード/バッチ挿入を挿入する必要がある状況があります。挿入された ID 値を取得するにはどうすればよいですか? OUTPUT 句を使用して、挿入されたテーブルから Id を取得しようとしましたが、常に null が返されます。

4

1 に答える 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 に答える