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?

Solução
  • 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ção INSERT 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.

Comentários (14)

MSDN

@@IDENTITY, SCOPE_IDENTITY, e IDENT_CURRENT são funções semelhantes, pois devolvem o último valor inserido na coluna IDENTITY de uma tabela.

@@IDENTITY e SCOPE_IDENTITY devolverão o último valor de identidade gerado em qualquer tabela da sessão em curso. Entretanto, SCOPE_IDENTITY retorna o valor apenas dentro do escopo atual; @@IDENTITY não está limitado a um escopo específico.

IDENT_CURRENT não está limitado por escopo e sessão; está limitado a uma tabela específica. IDENT_CURRENT retorna o valor de identidade gerado para uma tabela específica em qualquer sessão e em qualquer escopo. Para obter mais informações, consultar IDENT_CURRENT.

  • IDENT_CURRENT é uma função que toma uma tabela como argumento.
  • @@IDENTITY pode retornar um resultado confuso quando você tem um gatilho na tabela
  • SCOPE_IDENTITY é o seu herói a maior parte do tempo.
Comentários (0)

**@@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.

Comentários (2)