SELECT @@IDENTITY ...

23/04/2008 - 15:30 por Diego M Romero | Informe spam
Hola
Todos

Alguien sabe porque @@IDENTITY me devuelve mas de 800 registros?

Estoy haciendo una prueba insertando un registro en Orders de NorthWind, y
necesito el Id del último registro insertado,
pero me devuelve como 800 filas.

¿ es normal o algo estoy haciendo mal ?

select @@IDENTITY FROM Orders

Gracias

Diego M Romero

Preguntas similare

Leer las respuestas

#1 Leonardo Azpurua
23/04/2008 - 16:14 | Informe spam
"Diego M Romero" escribió en el mensaje
news:
Hola
Todos

Alguien sabe porque @@IDENTITY me devuelve mas de 800 registros?

Estoy haciendo una prueba insertando un registro en Orders de NorthWind, y
necesito el Id del último registro insertado,
pero me devuelve como 800 filas.

¿ es normal o algo estoy haciendo mal ?

select @@IDENTITY FROM Orders



Hola Diego,

Normalmente, basta con escribir SELECT @@IDENTITY -inmediatamente despues de
la operación de inserción- para obtener el numero de la columna marcada con
el atributo "IDENTITY" del último registro insertado.

Probé a escribir SELECT @@IDENTITY FROM unaTabla, y obtuve tantas filas -con
NULL, dado que no acabo de realizar ninguna inserción- como filas contien la
tabla.

@@IDENTITY es una variable global, que se condiciona al valor IDENTITY de la
fila que acaba de ser insertada.

En algún lugar del sitio de MS hay un artículo que se refiere a ciertos
problemas derivados del uso "simple" de SELECT @@IDENTITY que pueden
producirse cuando la inserción dispara un trigger. No tengo a mano la
referencia, pero valdría la pena que le dieras una leída.


Salud!
Respuesta Responder a este mensaje
#2 Alejandro Mesa
23/04/2008 - 17:01 | Informe spam
Leonardo Azpurua,

El problema relacionado con @@IDENTITY se debe a que esta devuelve el ultimo
valor idfentity insertado sin tomar en cuenta el contexto dende se realizo.
Por ejemplo, si tienes una tabla con una columna identity y esta a su vez
tiene un trigger que inserta en otra tabla con columna identity, entonces
@@IDENTITY retornara el valor insertado en la segunda tabla y no la primera.
Para este caso se recomienda el uso de la funcion SCOPE_IDENTITY.

Ejemplo:

create table dbo.t1 (c1 int not null identity(1, 1))
go

create table dbo.t2 (c1 int not null identity(2000, 1))
go

create trigger tr_t1_ins on dbo.t1
for insert
as
set nocount on
insert into dbo.t1 default values
go

insert into dbo.t1 default values

select @@identity, scope_identity()
go

drop table dbo.t1, dbo.t2
go


AMB

"Leonardo Azpurua" wrote:


"Diego M Romero" escribió en el mensaje
news:
> Hola
> Todos
>
> Alguien sabe porque @@IDENTITY me devuelve mas de 800 registros?
>
> Estoy haciendo una prueba insertando un registro en Orders de NorthWind, y
> necesito el Id del último registro insertado,
> pero me devuelve como 800 filas.
>
> ¿ es normal o algo estoy haciendo mal ?
>
> select @@IDENTITY FROM Orders

Hola Diego,

Normalmente, basta con escribir SELECT @@IDENTITY -inmediatamente despues de
la operación de inserción- para obtener el numero de la columna marcada con
el atributo "IDENTITY" del último registro insertado.

Probé a escribir SELECT @@IDENTITY FROM unaTabla, y obtuve tantas filas -con
NULL, dado que no acabo de realizar ninguna inserción- como filas contien la
tabla.

@@IDENTITY es una variable global, que se condiciona al valor IDENTITY de la
fila que acaba de ser insertada.

En algún lugar del sitio de MS hay un artículo que se refiere a ciertos
problemas derivados del uso "simple" de SELECT @@IDENTITY que pueden
producirse cuando la inserción dispara un trigger. No tengo a mano la
referencia, pero valdría la pena que le dieras una leída.


Salud!



Respuesta Responder a este mensaje
#3 Alejandro Mesa
23/04/2008 - 17:05 | Informe spam
Corrección,

create table dbo.t1 (c1 int not null identity(1, 1))
go

create table dbo.t2 (c1 int not null identity(2000, 1))
go

create trigger tr_t1_ins on dbo.t1
for insert
as
set nocount on
insert into dbo.t2 default values
go

insert into dbo.t1 default values

select @@identity, scope_identity()
go

drop table dbo.t1, dbo.t2
go


AMB


"Alejandro Mesa" wrote:

Leonardo Azpurua,

El problema relacionado con @@IDENTITY se debe a que esta devuelve el ultimo
valor idfentity insertado sin tomar en cuenta el contexto dende se realizo.
Por ejemplo, si tienes una tabla con una columna identity y esta a su vez
tiene un trigger que inserta en otra tabla con columna identity, entonces
@@IDENTITY retornara el valor insertado en la segunda tabla y no la primera.
Para este caso se recomienda el uso de la funcion SCOPE_IDENTITY.

Ejemplo:

create table dbo.t1 (c1 int not null identity(1, 1))
go

create table dbo.t2 (c1 int not null identity(2000, 1))
go

create trigger tr_t1_ins on dbo.t1
for insert
as
set nocount on
insert into dbo.t1 default values
go

insert into dbo.t1 default values

select @@identity, scope_identity()
go

drop table dbo.t1, dbo.t2
go


AMB

"Leonardo Azpurua" wrote:

>
> "Diego M Romero" escribió en el mensaje
> news:
> > Hola
> > Todos
> >
> > Alguien sabe porque @@IDENTITY me devuelve mas de 800 registros?
> >
> > Estoy haciendo una prueba insertando un registro en Orders de NorthWind, y
> > necesito el Id del último registro insertado,
> > pero me devuelve como 800 filas.
> >
> > ¿ es normal o algo estoy haciendo mal ?
> >
> > select @@IDENTITY FROM Orders
>
> Hola Diego,
>
> Normalmente, basta con escribir SELECT @@IDENTITY -inmediatamente despues de
> la operación de inserción- para obtener el numero de la columna marcada con
> el atributo "IDENTITY" del último registro insertado.
>
> Probé a escribir SELECT @@IDENTITY FROM unaTabla, y obtuve tantas filas -con
> NULL, dado que no acabo de realizar ninguna inserción- como filas contien la
> tabla.
>
> @@IDENTITY es una variable global, que se condiciona al valor IDENTITY de la
> fila que acaba de ser insertada.
>
> En algún lugar del sitio de MS hay un artículo que se refiere a ciertos
> problemas derivados del uso "simple" de SELECT @@IDENTITY que pueden
> producirse cuando la inserción dispara un trigger. No tengo a mano la
> referencia, pero valdría la pena que le dieras una leída.
>
>
> Salud!
>
>
>
Respuesta Responder a este mensaje
#4 Leonardo Azpurua
23/04/2008 - 18:45 | Informe spam
"Alejandro Mesa" escribió en el
mensaje news:
Leonardo Azpurua,

El problema relacionado con @@IDENTITY se debe a que esta devuelve el
ultimo
valor idfentity insertado sin tomar en cuenta el contexto dende se
realizo.
Por ejemplo, si tienes una tabla con una columna identity y esta a su vez
tiene un trigger que inserta en otra tabla con columna identity, entonces
@@IDENTITY retornara el valor insertado en la segunda tabla y no la
primera.
Para este caso se recomienda el uso de la funcion SCOPE_IDENTITY.



Gracias.

Eso lo recuerdo... lo que se me olvidó es la solución propuesta en el
artículo :-)

¿SCOPE_IDENTITY viene en SqlS 2000?

Salud!
Respuesta Responder a este mensaje
#5 Alejandro Mesa
23/04/2008 - 19:18 | Informe spam
Leonardo Azpurua,

Si, viene end >= 2000.


AMB

"Leonardo Azpurua" wrote:


"Alejandro Mesa" escribió en el
mensaje news:
> Leonardo Azpurua,
>
> El problema relacionado con @@IDENTITY se debe a que esta devuelve el
> ultimo
> valor idfentity insertado sin tomar en cuenta el contexto dende se
> realizo.
> Por ejemplo, si tienes una tabla con una columna identity y esta a su vez
> tiene un trigger que inserta en otra tabla con columna identity, entonces
> @@IDENTITY retornara el valor insertado en la segunda tabla y no la
> primera.
> Para este caso se recomienda el uso de la funcion SCOPE_IDENTITY.

Gracias.

Eso lo recuerdo... lo que se me olvidó es la solución propuesta en el
artículo :-)

¿SCOPE_IDENTITY viene en SqlS 2000?

Salud!



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