Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

marques007

[Resolvido] Por que usar Scope_Identity() ao inves de @@IDENTITY

Recommended Posts

Ola pessoal ... gostaria do auxilio de vcs para saber em quais casos devo usar o @@identity e em quais Scope_identity no sqlserver 2005... e possiveis melhoras no caso de uma procedure...obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

A partir do SQL2005 use Scope_Identity() somente.

Já levei muita surra por conta disso.

 

Vou tentar ser breve...

 

O que ocorre é que o @@IDENTITY não pega o valor identity daquele bloco da transação, ele pega o valor identity da transação como um todo. Exemplo: se você pega o @@IDENTITY dentro da sua procedure após fazer um insert na tabela A e a tabela A tem uma trigger que dispara a cada insert... o @@IDENTITY vai pegar o ID da query e não o ID do registro que você acabou de inserir.

 

Isso gera um baita problema, porque se você vai usar esse ID num comanda seguinte nesta mesma procedure, por exemplo, ele vai inserir com um ID totalmente errado, quando não der erro de PK. Enfim, vai gerar uma #@?$%~ inconsistencia de dados na sua base, na melhor das hipoteses.

 

Sendo assim, use o Scope_Identity() bonitinho que a Microsoft nos fornece a partir da versão 2005 que não tem erro.

Posso falar isso pois, como eu disse, apanhei muito por causa disso no começo.

 

Espero que ajude pois esta informação com certeza será relevante ainda aqui no fórum para muita gente.

[]tz ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, eu sei. Porém, até o SQL2000 ninguém tinha problemas com @@IDENTITY.

 

 

Legal aquele seu post!

Aproveitando vou pôr aqui para tornar as informações mais completas:

 

select IDENT_CURRENT('nomedatabela') --retorna o último Id inserido em uma determinada tabela, indepentende de conexão, escopo, etc, vai na tabela e verifica qual o último id que foi inserido

 

select @@IDENTITY --retorna o ultimo ID inserido na conexão atual, independente de tabela

 

select SCOPE_IDENTITY() --retorna o ultimo ID inserido, independente de tabela no mesmo escopo (stored proc, trigger, função) --> ver mais detalhes no books on-line

 

[]tz ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.