http://blogs.sqlpassj.org/yoshihirokawabata/archive/2006/07/03/17342.aspx
河端さんがOUTPUT句を紹介してくれていたので、早速試してみます。
まずはtestデータベースを作成して
use test
go
drop table tt
go
create table tt(
[id] int identity not null primary key,
[dt] datetime not null default getdate(),
[val] nvarchar(100)
)
go
このようなテーブルを作成します。
INSERTしたデータの更新結果を取得する場合今まではscope_identity()で結果のID値を取得して、その結果を再度取り直していました。
insert into [dbo].[tt]([val])
values ('a');
declare @id int
set @id = scope_identity()
select [dt] from [dbo].[tt] where [id] = @id
それが以下のように変更することが出来ます。
insert into [dbo].[tt]([val])
output INSERTED.[dt]
values ('a');
パフォーマンスを調べてみたのですが、上のパターンが
INSERT 43%
SELECT 14%
で合計57%のところ下のパターンでは
INSERT 43%
となりました。
完全にSELECTしなおす部分の効率が上がっています。
効率だけではなく、たとえばデータパッチの結果をINSERTEDから表示させることが可能です。
キーを含むUPDATEを行った場合には、トリガでも仕込まないとわからないなんてことも回避可能です。
すばらしいので早速組み込むことにします。(^^