2009-03-20 4 views
6

Die MSDN-Dokumente wurden in diesem Fall nicht vollständig klargestellt. oder vielleicht lese ich sie nicht gut genug.Was passiert, wenn ich SCOPE_IDENTITY() nach einer fehlgeschlagenen Einfügung (SQL Server 2005) auswähle

Wenn ich einen Einsatz (die Null Zeilen einfügen kann), gefolgt von

;SELECT SCOPE_IDENTITY() 

Und dann durch ExecuteScalar der Befehl() aufrufen ...

Was wird das Ergebnis sein, wenn der Einsatz fügt keine Zeilen ein?

Ich möchte stoppen, wenn es fehlschlägt, so dass ich nicht fortfahre, untergeordnete Datensätze in eine falsche oder falsche Eltern-ID einzufügen.

+1

Sie nicht über die parallele Ausführung Fehler vergessen, die für SCOPE_IDENTITY und @@ IDENTITY in SQL Server vorhanden ist: http://support.microsoft.com/default.aspx?scid=kb;en-US;2019779 –

Antwort

11

Wenn keine Identität eingefügt wird SCOPE_IDENTITY() gibt null zurück, Sie können nach der angegebenen Bedingung suchen, indem Sie SCOPE_IDENTITY() einer Variablen zuweisen und dann den Inhalt der Variablen überprüfen.

Illustration

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

also kann ich SELECT IsNull (Scope_Identity(), -1) so tun, dass ich immer eine gültige INT und der Fehlerwert kann nicht eine tatsächliche ID sein? (unter der Annahme, dass meine Identität bei 1 beginnt) –

+3

könnte es sich lohnen, einige esoterische Szenarien zu testen ... INSERT in einer Tabelle, wo ein Trigger die Integrität erhält und einen Fehler auslöst, um das Einfügen zu verhindern ... – MatBailie

+0

@Dems, das ist interessant test, ich werde es versuchen. –

3

NULL

Quelle: ein SELECT scope_identity hat() auf einer leeren Abfrage (aka kein Insert)

3

Es hängt davon ab, ob es ein erfolgreicher Einsatz innerhalb der gewesen aktueller Umfang.

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 
Verwandte Themen