2009-03-20 9 views
6

MSDNドキュメントはこのドキュメントでは完全にはっきりしていませんでした。おそらく私は十分にそれらを読んでいない。挿入が失敗した後にSCOPE_IDENTITY()を選択するとどうなりますか(SQL Server 2005)

私は

;SELECT SCOPE_IDENTITY() 

そしては、ExecuteScalar(でコマンドを呼び出すに続く(ゼロ行を挿入することができる)のインサートを、)やるなら...

を挿入した場合、結果はどうなります行は挿入されませんか?

失敗した場合は停止して、悪い、または間違った親IDに子レコードを挿入し続けることはしません。

+1

SCOPE_IDENTITYと@@ IDENTITYのSQL Serverに存在する並列実行のバグを忘れないでください。http://support.microsoft.com/default.aspx?scid=kb;en-US;2019779 –

答えて

11

IDが挿入されていない場合、SCOPE_IDENTITY()はnullを返します.SCOPE_IDENTITY()を変数に割り当て、変数の内容をチェックすることで、指定した条件をチェックできます。

イラスト

Create Proc SomeInsertToFail(@ID int OUTPUT) 
as 
Begin 
    Select @ID = Scope_Identity() 
End 
Declare @SOMEID int 
Exec SomeInsertToFail @SOMEID OUTPUT 
Select @SOMEID --This will yield null 
+0

私はいつも有効なINTを取得するように、SELECT IsNull(Scope_Identity()、-1)を行うことができますが、実際のIDは失敗しません。 (もちろん私の身元は1で始まると仮定します) –

+3

はもっと秘密のシナリオでテストする価値があるかもしれません...トリガが完全性を維持し、挿入を妨げるエラーを発生させるテーブルにINSERT ... – MatBailie

+0

@Dems、thats a interestingテスト、私はそれを試してみましょう。 –

3

NULL

ソース:空のクエリのSELECT SCOPE_IDENTITY()(別名なし挿入)は

3

それは内SUCCESSFULの挿入があったかどうかに依存しませんでした現在の範囲。

declare @tb table (i int identity, ky varchar(100)); 

insert into @tb values('Success'); 

insert into @tb select ky from @tb where ky = 'Failure'; 

select SCOPE_IDENTITY(); -- returns 1 
select * from @tb 
関連する問題