Eu sei Scope_Identity()
, Identity()
,@@Identity
, and Ident_Current()
all get the value of the identity column, but I would love to know the difference.
Part of the controversy I'm having is what do they mean by scope as applied to these functions above?
Eu também adoraria um exemplo simples de diferentes cenários de usá-los?
sql
sql-server
identity
Tebo
fonte
fonte
Respostas:
@@identity
function returns the last identity created in the same session.scope_identity()
function returns the last identity created in the same session and the same scope.ident_current(name)
returns the last identity created for a specific table or view in any session.identity()
function is not used to get an identity, it's used to create an identity in aselect...into
query.The session is the database connection. The scope is the current query or the current stored procedure.
A situation where the
scope_identity()
and the@@identity
functions differ, is if you have a trigger on the table. If you have a query that inserts a record, causing the trigger to insert another record somewhere, thescope_identity()
function will return the identity created by the query, while the@@identity
function will return the identity created by the trigger.So, normally you would use the
scope_identity()
function.fonte
Boa pergunta.
@@IDENTITY
: retorna o último valor de identidade gerado na sua conexão SQL (SPID). Na maioria das vezes, será o que você deseja, mas às vezes não é (como quando um gatilho é disparado em resposta a umINSERT
e o gatilho executa outraINSERT
instrução).SCOPE_IDENTITY()
: retorna o último valor de identidade gerado no escopo atual (ou seja, procedimento armazenado, gatilho, função etc.).IDENT_CURRENT()
: retorna o último valor de identidade para uma tabela específica. Não use isso para obter o valor da identidade de umINSERT
, pois está sujeito a condições de corrida (ou seja, várias conexões inserindo linhas na mesma tabela).IDENTITY()
: usado ao declarar uma coluna em uma tabela como uma coluna de identidade.Para mais referência, consulte: http://msdn.microsoft.com/en-us/library/ms187342.aspx .
Para resumir: se você estiver inserindo linhas e quiser saber o valor da coluna de identidade da linha que você acabou de inserir, use sempre
SCOPE_IDENTITY()
.fonte
Se você entender a diferença entre escopo e sessão, será muito fácil entender esses métodos.
Um post muito bom de Adam Anderson descreve esta diferença:
Portanto, as diferenças entre os três métodos de recuperação de identidade são as seguintes:
fonte
Escopo significa o contexto do código que executa a
INSERT
instruçãoSCOPE_IDENTITY()
, em oposição ao escopo global de@@IDENTITY
.Dá resultados diferentes.
fonte
Por causa do bug mencionado por @David Freitas e por causa da incompatibilidade com o novo recurso Sequence que foi introduzido em 2012, eu recomendaria ficar longe desses três. Em vez disso, você pode usar a cláusula OUTPUT para obter o valor da identidade inserido. A outra vantagem é que OUTPUT funciona mesmo se você tiver inserido mais de uma linha.
Para detalhes e exemplos, consulte aqui: Crise de identidade
fonte
Para esclarecer o problema com
@@Identity
:Por exemplo, se você inserir uma tabela e essa tabela tiver gatilhos fazendo inserções,
@@Identity
retornará o ID da inserção no gatilho (alog_id
ou algo assim), enquantoscope_identity()
retornará o ID da inserção na tabela original.Então, se você não tem nenhum gatilhos,
scope_identity()
e@@identity
irá retornar o mesmo valor. Se você tiver gatilhos, precisará pensar em qual valor gostaria.fonte
Scope Identity
: Identidade do último registro adicionado ao procedimento armazenado que está sendo executado.@@Identity
: Identity of last record added within the query batch, or as a result of the query e.g. a procedure that performs an insert, the then fires a trigger that then inserts a record will return the identity of the inserted record from the trigger.IdentCurrent
: The last identity allocated for the table.fonte
Here is another good explanation from the book:
fonte