none
Retornar ID por SP após insert RRS feed

  • Pergunta

  •  

    Pessoal,

     

    Como vocês fazem na situação abaixo:

     

    Tenho uma procedure que faz um insert na base, e se não deu nenhum erro me retorna o ID para a aplicação, da seguinte forma:

     

    Code Snippet

    SET @ID = IDENT_CURRENT('NOME_DA_TABELA')

     

     

    Vocês fazem assim? Isso garante que terei o ID correto?

     

    Se não, qual seria a maneira mais correta para obter o ID referente aquele registro?

     

    Obrigado,

     

    Fernando

    quarta-feira, 7 de janeiro de 2009 19:01

Respostas

  • Fernando, eu utilizo parâmetros de saída, note a variavel @Sequencial, ela recebe o SCOPE_IDENTITY()

     

    Olhe o exemplo:

     

    Code Snippet

    CREATE PROCEDURE [dbo].[usp_MinhaSP]

    -- Parametros da SP

    @Sequencial int OUTPUT,

    @MesReferencia datetime

    AS

    BEGIN

       SET NOCOUNT ON;

       BEGIN

    -- INSERT

       insert into Painel_Cabecalho (Mes_Referencia) values (@MesReferencia)

       SET @Sequencial = SCOPE_IDENTITY()

       END

    END

     

     

    quarta-feira, 7 de janeiro de 2009 19:06
    Moderador

Todas as Respostas

  • Fernando, eu utilizo parâmetros de saída, note a variavel @Sequencial, ela recebe o SCOPE_IDENTITY()

     

    Olhe o exemplo:

     

    Code Snippet

    CREATE PROCEDURE [dbo].[usp_MinhaSP]

    -- Parametros da SP

    @Sequencial int OUTPUT,

    @MesReferencia datetime

    AS

    BEGIN

       SET NOCOUNT ON;

       BEGIN

    -- INSERT

       insert into Painel_Cabecalho (Mes_Referencia) values (@MesReferencia)

       SET @Sequencial = SCOPE_IDENTITY()

       END

    END

     

     

    quarta-feira, 7 de janeiro de 2009 19:06
    Moderador
  • Boa Tarde,

     

    A forma que o Roberto faz é provavelmente a mais correta (outra possibilidade seria o @@identity). O IDENT_CURRENT não é muito seguro, pois, se alguém inserir um registro após o seu INSERT e antes do IDENT_CURRENT você irá capturar o último ID (mesmo que não seja o do respectivo INSERT).

     

    [ ]s,

     

    Gustavo

    http://gustavomaiaaguiar.spaces.live.com

     

    quarta-feira, 7 de janeiro de 2009 19:10
  • Olá,

     

    Já utilizei em casos parecidos com este o @@Identity, mas percebi que em alguns momentos o valor que esta sendo retorno não é o atual, sendo assim, comecei a utilizar o Scope_Ident.

     

    Concordo com a orientação do Roberto.

    quarta-feira, 7 de janeiro de 2009 19:16
  • Valeu Pessoal!

     

    Irei utilizar o SCOPE_IDENTITY()

     

    Obrigado.

     

    Fernando

     

    quarta-feira, 7 de janeiro de 2009 19:20
  • Com certeza para o caso o SCOPE_IDENTITY() é a melhor opção. Ele retorna o último ID gerado num escopo de sessão. Sendo assim, mesmo que a tabela citada acima tenha alguma trigger que insira em outra tabela e essa outra tabela tb tenha um IDENTITY, ele retornará o identity da tabela citada( nesse caso o correto ), pois seu escopo é por sessão.

     

    Abraços

     

     

    quarta-feira, 7 de janeiro de 2009 19:25