SCOPE_IDENTITY() es NULL?

08/08/2007 - 12:41 por AC | Informe spam
Buenos días,

Me he encontrado con el siguiente comportamiento extraño, por lo menos para
mí, de la función SCOPE_IDENTITY():

- Si una tabla tiene un campo IDENTITY, pero tiene un TRIGGER ' INSTEAD OF
INSERT ', aún cuando en el trigger
se termine realizando el INSERT sobre la misma tabla, SCOPE_IDENTITY()
devuelve NULL. No así, tanto @@IDENTITY como IDENT_CURREN('TABLA').

- Tengo una aplicación donde el valor IDENTITY es usado como parte de tablas
dependientes. Con el objetivo de asegurarme obtener un valor correcto estaba
usando SCOPE_IDENTITY(), para evitar que TRIGGERS lanzados
por INSERT provocasen una devolución incorrecta para @@IDENTITY. Por otra
parte, usar IDENT_CURREN('TABLA') me podía dar problemas de concurrencia.

- En una tabla que tenía con esta aplicación se le ha añadido un TRIGGER '
INSTEAD OF INSERT ' para efectuar
unas verificaciones previas que se han añadido a la funcionalidad. Pues
bien, desde ese momento, se obtienen NULL para SCOPE_IDENTITY() en esa
tabla. Deshabilitando el TRIGGER todo funciona como antes.

- El script del pie creo que visualiza lo que he querido decir.

Agradecería un comentario. Muchas gracias anticipadas.

BARCELONA


-

CREATE TABLE
[Tb_TABLA] (
[NUMERO] int,
[ID_TABLA] int IDENTITY
PRIMARY KEY CLUSTERED
(
[NUMERO]
) )
GO

CREATE TRIGGER Tr_TBLA_INS_OF_INS
ON Tb_TABLA
INSTEAD OF INSERT

AS

begin

SET NOCOUNT ON


INSERT INTO dbo.Tb_TABLA
([NUMERO])
SELECT
[NUMERO]
FROM INSERTED

SET NOCOUNT OFF
RETURN

end
GO

INSERT INTO dbo.Tb_TABLA
(NUMERO)
VALUES (1)


select SCOPE_IDENTITY()
select @@IDENTITY
select IDENT_CURRENT('Tb_TABLA')

GO

ALTER TABLE dbo.Tb_TABLA
DISABLE TRIGGER Tr_TBLA_INS_OF_INS
GO

INSERT INTO dbo.Tb_TABLA
(NUMERO)
VALUES (2)


select SCOPE_IDENTITY()
select @@IDENTITY
select IDENT_CURRENT('Tb_TABLA')

GO
-
-

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
08/08/2007 - 15:34 | Informe spam
AC,

En este caso, el alcance de la sentencia "insert" comienza y termina con el
trigger por lo que la funcion scope_identity no devolvera un valor correcto
fuera de ese alcance. Si preguntas por ese valor dentro del trigger, veras
que el valor sera el correcto.

CREATE TRIGGER Tr_TBLA_INS_OF_INS
ON dbo.Tb_TABLA
INSTEAD OF INSERT

AS

begin

SET NOCOUNT ON

INSERT INTO dbo.Tb_TABLA
([NUMERO])
SELECT
[NUMERO]
FROM
INSERTED

select scope_identity()

SET NOCOUNT OFF
RETURN
end
GO


AMB


"AC" wrote:

Buenos días,

Me he encontrado con el siguiente comportamiento extraño, por lo menos para
mí, de la función SCOPE_IDENTITY():

- Si una tabla tiene un campo IDENTITY, pero tiene un TRIGGER ' INSTEAD OF
INSERT ', aún cuando en el trigger
se termine realizando el INSERT sobre la misma tabla, SCOPE_IDENTITY()
devuelve NULL. No así, tanto @@IDENTITY como IDENT_CURREN('TABLA').

- Tengo una aplicación donde el valor IDENTITY es usado como parte de tablas
dependientes. Con el objetivo de asegurarme obtener un valor correcto estaba
usando SCOPE_IDENTITY(), para evitar que TRIGGERS lanzados
por INSERT provocasen una devolución incorrecta para @@IDENTITY. Por otra
parte, usar IDENT_CURREN('TABLA') me podía dar problemas de concurrencia.

- En una tabla que tenía con esta aplicación se le ha añadido un TRIGGER '
INSTEAD OF INSERT ' para efectuar
unas verificaciones previas que se han añadido a la funcionalidad. Pues
bien, desde ese momento, se obtienen NULL para SCOPE_IDENTITY() en esa
tabla. Deshabilitando el TRIGGER todo funciona como antes.

- El script del pie creo que visualiza lo que he querido decir.

Agradecería un comentario. Muchas gracias anticipadas.

BARCELONA


-

CREATE TABLE
[Tb_TABLA] (
[NUMERO] int,
[ID_TABLA] int IDENTITY
PRIMARY KEY CLUSTERED
(
[NUMERO]
) )
GO

CREATE TRIGGER Tr_TBLA_INS_OF_INS
ON Tb_TABLA
INSTEAD OF INSERT

AS

begin

SET NOCOUNT ON


INSERT INTO dbo.Tb_TABLA
([NUMERO])
SELECT
[NUMERO]
FROM INSERTED

SET NOCOUNT OFF
RETURN

end
GO

INSERT INTO dbo.Tb_TABLA
(NUMERO)
VALUES (1)


select SCOPE_IDENTITY()
select @@IDENTITY
select IDENT_CURRENT('Tb_TABLA')

GO

ALTER TABLE dbo.Tb_TABLA
DISABLE TRIGGER Tr_TBLA_INS_OF_INS
GO

INSERT INTO dbo.Tb_TABLA
(NUMERO)
VALUES (2)


select SCOPE_IDENTITY()
select @@IDENTITY
select IDENT_CURRENT('Tb_TABLA')

GO
-
-



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida