2009-03-20 13 views
6

MSDN dokümanları bu konuda tamamen açık değildi. ya da belki onları yeterince okumam.Ekleme başarısız olduktan sonra SCOPE_IDENTITY() öğesini seçerseniz ne olur (SQL Server 2005)

Sonra

;SELECT SCOPE_IDENTITY() 

Ve ardından bir ekleme (sıfır satır eklemek olabilir), ExecuteScalar() tarafından komut diyoruz ...

sonuç Ekle ederse ne olacak yaparsanız herhangi bir satır eklemiyor?

Hatalı veya yanlış bir üst kimlik için alt kayıtları eklemek için devam etmemem başarısız olursa durdurmak istiyorum.

+1

paralel yürütme SCOPE_IDENTITY için SQL Server bulunmaktadır hata ve @@ unutmayın KİMLİK: http://support.microsoft.com/default.aspx?scid=kb;en-US;2019779 –

cevap

11

Kimlik girilmezse, SCOPE_IDENTITY() öğesi null değerini döndürür, belirttiğiniz koşulu SCOPE_IDENTITY() öğesini bir değişkene atayarak ve sonra da değişkenlerin içeriğini denetleyerek kontrol edebilirsiniz.

İllüstrasyon

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

böylece SELECT IsNull (Scope_Identity(), -1) yapabilirim, her zaman geçerli bir INT alır ve başarısızlık değeri gerçek bir kimlik olamaz? (Tabii kimliğimin 1'den başlayacağını varsayarak) –

+3

, bazı ezoterik senaryolarda test edilmeye değer olabilir ... Bir tetikleyicinin bütünlüğünü koruduğu ve ekini engellemek için bir hata ortaya çıkardığı bir tablo üzerine INSERT ... – MatBailie

+0

@Dems, ilginç test, bir deneyeceğim. –

3

BOŞ

kaynak: Boş sorguya bir SEÇ SCOPE_IDENTITY() (aka hiçbir insert)

3

O içinde BAŞARILI insert edilip bağlıdır vermedi mevcut kapsam.

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 
İlgili konular