none
Como pegar o ID da tabela em que estou inserindo? RRS feed

  • Pergunta

  • Olá à Todos!!!

     

    Para encontrar o ID da tabela que estou inserindo estou usando o seguinte comando:

     

    SELECT     IDENT_CURRENT('Pessoa') AS PE_ID

     

    Mas minha dúvida é se:

    - Essa instrução vai me retornar o id que eu mesmo inseri ou se o id inserido será o último inserido por qualquer outro usuário em uma outra transação envolvendo a mesma tabela, inserindo antes de mim, consequentemente influindo no ID, pois neste caso nao seria o ID do insert que realizei mas seria o ID inserido por último de outro insert.

     

    Como poderia tratar para garantir que o ID que estou inserindo é o último que eu mesmo realmente estou inserindo?? Quero obter o último que eu estou inserindo. 

     

    Aguardo apoio.

     

     

    segunda-feira, 10 de novembro de 2008 18:03

Respostas

  • Olá Magno,

     

    O SCOPE_IDENTITY e o @@identity só retornaram o resultado correto se você fizer uma inserção em uma tabela Identity e se forem executados imediatamente após o INSERT. Se você simplesmente abrir uma sessão e digitá-los nada será retornado, pois, sua conexão não gerou nenhum Identity.

     

    [ ]s,

     

    Gustavo

     

    terça-feira, 11 de novembro de 2008 13:11

Todas as Respostas

  • O Ident_Current irá retornar o ultimo Identity inserido por qualquer sessão,

    Para retornar o ultima ID da sua sessão utilize Scope_Identity para retornar o ultimo Identity dentro do seu escopo, ou @@Identity para retornar o ultimo identity inserido dentro de sua sessão,
    segunda-feira, 10 de novembro de 2008 19:03
  • Boa Tarde,

     

    Essa instrução irá retornar o último ID e não necessariamente foi o ID inserido por você (pode haver um novo ID entre o momento que você insere e o momento que você consulte).

     

    Para obter o ID que você realmente inseriu, utilize o @@identity ou Scope_Identity(). Há uma sutil diferença entre eles. Recomendo que você leia o artigo abaixo para maiores detalhes:

     

    SQL Server: Geração de seqüenciais de forma automática

    http://www.plugmasters.com.br/sys/materias/836/1/SQL-Server%3A-Gera%E7%E3o-de-seq%FCenciais-de-forma-autom%E1tica

     

    [ ]s,

     

    Gustavo

    segunda-feira, 10 de novembro de 2008 19:10
  • Considerando os conceitos do Artigo sugerido:

     

    @@identity

    Retorna o último Identity gerado para a conexão que efetuou uma operação em uma tabela com a coluna Identity. Quando são realizadas inserções de registros em uma tabela com coluna Identity, pode ser desejado capturar o valor gerado para essa coluna (possivelmente para retorná-lo para a aplicação). O @@identity retorna esse valor. No entanto, se múltiplos INSERTs forem disparados em uma ou mais tabelas com Identity, o @@identity irá retornar o último Identity gerado para a tabela presente no último INSERT.

     

     

    Apenas para confirmar:

     

     

    SCOPE_IDENTITY()  - Acredito ser este minha melhor opção, porque necessito o ID do registro que eu mesmo acabei de inserir.

     

    Possui um efeito semelhante ao @@identity, mas ao contrário do @@identity, considera o escopo em que foi gerado. Será demonstrado um exemplo prático de sua utilização mais posteriormente.

     

     

    Poderia me explicar ou citar o que é escopo no sql server, ou para este caso, seria global ou local, algo do tipo?

     

    Aguardo sugestões...

    segunda-feira, 10 de novembro de 2008 19:24
  • Boa Tarde,

     

    Eu acredito que para a sua situação, tanto o @@identity quanto o SCOPE_IDENTITY() irão lhe atender. Ambos irão gerar o último valor do Identity inserido. A questão é que sobre raras circunstâncias isso não é bem verdade. No próprio artigo eu abordo quando isso acontece. Consulte:

     

    Divergências

    http://www.plugmasters.com.br/sys/materias/836/6/SQL-Server%3A-Gera%E7%E3o-de-seq%FCenciais-de-forma-autom%E1tica

     

    [ ]s,

     

    Gustavo

    segunda-feira, 10 de novembro de 2008 20:27
  • Maia,

     

    Realmente são raras as situações, o que eu já presenciei é quando você tem várias sessões conectadas sendo que cada uma delas estará gerando o Identity e depedendo do método que você esta utilizando você vai receber o último identity gerado pela sessão que você esta conectado e não o último valor gerado independente da sessão.

    terça-feira, 11 de novembro de 2008 09:56
  •  

    Após estudar considerando os conceitos apresentados, realizei algumas consultas para obter o último identy inserido por mim (no meu escopo, da minha conexão), porque não quero que obtenha o valor errado de outros inserts concorrentes/simultâneos, quero o último inserido no meu insert, por isso estou escolhendo a função SCOPE_IDENTITY(), mas me corrijam se estiver errado, das querys foi retornado:

     

    SELECT    IDENT_CURRENT('Pessoa') AS PE_ID   - mas nao trata concorrencia / insert simultaneo - traz o último

     

    id - 8465

     

    Realizando essa outra query abaixo, na opção new query, botao direito na tabela, me retornou somente NULL tanto para @@identity quanto Scope_Identity()

     

    Preciso especificar que tabela me refiro ou ele encontra a do insert automático ?

     

    Como faço para obter o último id ao invés do NULL que está vindo, preciso do último id meu inserido!!!

     


    -- Captura o valor de @@identity e Scope_Identity()
    SELECT
        @@identity As [Identity],
        Scope_Identity() As [Scope_Identity_PE_ID]

     

     

    Aguardo Ajuda...

    terça-feira, 11 de novembro de 2008 12:01
  • Olá Magno,

     

    O SCOPE_IDENTITY e o @@identity só retornaram o resultado correto se você fizer uma inserção em uma tabela Identity e se forem executados imediatamente após o INSERT. Se você simplesmente abrir uma sessão e digitá-los nada será retornado, pois, sua conexão não gerou nenhum Identity.

     

    [ ]s,

     

    Gustavo

     

    terça-feira, 11 de novembro de 2008 13:11