2009-03-20 8 views
6

Los documentos de MSDN no fueron del todo claros en este caso. o quizás no los estoy leyendo lo suficientemente bien.Qué ocurre si selecciono SCOPE_IDENTITY() después de que falla una inserción (SQL Server 2005)

Si hago una inserción (que puede insertar cero filas), seguido de

;SELECT SCOPE_IDENTITY() 

Y luego llamar al comando por ExecuteScalar() ...

Cuál será el resultado si el inserto no inserta ninguna fila?

Quiero detenerme si falla para no continuar insertando registros secundarios en una identificación padre incorrecta o incorrecta.

+1

No se olvide del error de ejecución en paralelo que existe en SQL Server para SCOPE_IDENTITY y @@ IDENTIDAD: http://support.microsoft.com/default.aspx?scid=kb;en-US;2019779 –

Respuesta

11

Si no se inserta la identidad SCOPE_IDENTITY() devolverá nulo, puede verificar la condición que especifica al asignar SCOPE_IDENTITY() a una variable y luego verificar el contenido de las variables.

Ilustración

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

modo puede decido comer IsNull (SCOPE_IDENTITY(), -1) de manera que siempre me dan una variable del tipo INT y el valor fallar puedo ser una identificación real? (asumiendo por supuesto que mi identidad comienza en 1) –

+3

podría valer la pena probar en algunos escenarios más esotéricos ... INSERTAR en una tabla donde un desencadenador mantiene la integridad y provoca un error para evitar la inserción ... – MatBailie

+0

@Dems, eso es interesante prueba, lo intentaré. –

3

NULL

fuente: realizó un SCOPE_IDENTITY SELECT() en una consulta en blanco (también conocido como sin inserción)

3

Depende de si se ha producido un inserto de éxito dentro de la alcance actual.

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 
Cuestiones relacionadas