2008年4月25日金曜日

[.NET]INSERT時の自動採番される値を取得する(SQLSERVER)(その2)

GDD Blog: [.NET]INSERT時の自動採番される値を取得する(SQLSERVER)で、自動採番した値を取得する方法について書きましたが、たとえば、同一トランザクション内で自動採番されるテーブルが2つ以上あり、その2のテーブルで採番された値を後方の処理で利用する必要がある場合、SCOPE_IDENTITY()では最後のINSERTで生成した値しか取れません。でどうするかというと、IDENT_CURRENT('table_name')を使います。

■テーブルの構成
CREATE TABLE [TABLE1] (
    [pid] [intIDENTITY (11NOT NULL ,
    [tex1] [char] (10COLLATE Japanese_CI_AS NULL ,
    [tex2] [char] (10COLLATE Japanese_CI_AS NULL ,
    CONSTRAINT [PK_TABLE1PRIMARY KEY  CLUSTERED 
    (
        [pid]
    )  ON [PRIMARY
)
GO


■実行したSQL
begin transaction

insert into table1(tex1tex2)values('1','2')

print '■table1'
SELECT  '@@IDENTITY' , @@IDENTITY 
SELECT  'SCOPE_IDENTITY' , SCOPE_IDENTITY()
SELECT  'IDENT_CURRENT' , IDENT_CURRENT('table1')

insert into table2(tex1tex2)values('1','2')
print '■table2'
SELECT  '@@IDENTITY' , @@IDENTITY 
SELECT  'SCOPE_IDENTITY' , SCOPE_IDENTITY()
SELECT  'IDENT_CURRENT' , IDENT_CURRENT('table1')

rollback


■実行結果
table1
@@IDENTITY    9
SCOPE_IDENTITY    9
IDENT_CURRENT    9

table2
@@IDENTITY    1
SCOPE_IDENTITY    1
IDENT_CURRENT    9


※table1は8件、table2は0件の状態です。

(注意)GDD Blog: [.NET]INSERT時の自動採番される値を取得する(SQLSERVER)(その3)で問題点を記載しています。こちらも参照してください。

0 件のコメント: