Mais
A melhor maneira de obter a identidade da fila inserida?
Qual é a melhor maneira de obter "IDENTIDADE" de fila inserida?
Eu sei sobre @@IDENTITY
e IDENT_CURRENT
e SCOPE_IDENTITY
mas don'não entendo os prós e contras ligados a cada um.
Alguém pode explicar as diferenças e quando eu deveria usar cada uma delas?
1051
3
1 retorna o último valor de identidade gerado para qualquer tabela da sessão atual, em todos os escopos. Você precisa ter cuidado aqui, já que ele's em todos os escopos. Você pode obter um valor a partir de um gatilho, ao invés do seu comando atual.
SCOPE_IDENTITY()
retorna o último valor de identidade gerado para qualquer tabela na sessão atual e o escopo atual. **Geralmente o que você quer utilizar***.IDENT_CURRENT('tableName')
retorna o último valor de identidade gerado para uma tabela específica em qualquer sessão e em qualquer escopo. Isto permite especificar de qual tabela você quer o valor, caso as duas acima sejam't exatamente o que você precisa (**muito raro***). Também, como @Guy Starbuck mencionado, "Você pode usar isto se você quiser obter o valor de IDENTIDADE atual para uma tabela que você não tenha inserido um registro em."A cláusula
OUTPUT
da declaraçãoINSERT
lhe permitirá acessar cada linha que foi inserida através dessa declaração. Desde que it's scoped para a declaração específica, it's mais simples do que as outras funções acima. Entretanto, it's um pouco mais verboso (você'precisará inserir em uma tabela variável/tabela de temperatura e então consultar isso) e dá resultados mesmo em um cenário de erro onde o comando é rolado para trás. Dito isto, se a sua consulta usa um plano de execução paralela, este é o método somente garantido para obter a identidade (a não ser desligar o paralelismo). No entanto, ele é executado antes e não pode ser usado para retornar valores gerados por trigger.MSDN
**@@IDENTITY*** é a última identidade inserida utilizando a actual ligação SQL. Este é um bom valor para retornar de um procedimento de inserção armazenado, onde você só precisa da identidade inserida para o seu novo registro, e don'não importa se mais linhas foram adicionadas depois.
SCOPE_IDENTITY é a última identidade inserida usando a conexão SQL atual, e no escopo atual -- ou seja, se houvesse uma segunda IDENTITY inserida com base em um gatilho após a sua inserção, ela não seria refletida em SCOPE_IDENTITY, apenas a inserção que você realizou. Francamente, eu nunca tive uma razão para usar isto.
IDENT_CURRENT(tablename) é a última identidade inserida independentemente da conexão ou do escopo. Você pode usar isto se quiser obter o valor de IDENTIDADE atual para uma tabela na qual você não tenha inserido um registro.