none
SCOPE_IDENTITY() RRS feed

  • Pergunta

  • Pessoal tenho uma procedure que no final executa o  seguinte comando para recuperar o ID inserido:

     

    SELECT cd_cgoger FROM TB_CARGO_GERENCIAL WHERE cd_cgoger = SCOPE_IDENTITY()

    Porém não está funcionando quando executo esse funciona:

     

    SELECT IDENT_CURRENT('TB_CARGO_GERENCIAL') cd_cgoger

    Alguem sabe o pq disso?

    sexta-feira, 6 de janeiro de 2012 13:57

Respostas

  • Ricardo,

    O Comando EXEC está rodando em outro "escopo", por esse motivo a função SCOPE_IDENTITY() retorna NULL quando você executa seu select.

    Para ver o funcionamento faça o seguinte teste no final da sua instrução insert acrescente um select na função, desta forma

     

    SET @StrSQL = @StrSQL + ') ; SELECT SCOPE_IDENTITY()'
    

     


    Você verá que o valor retornado será o do último identity do escopo, no caso, o que foi inserido, porém, acrescente ao final da proc um select na função, você verá que no exec retorna o valor e na consulta fora dele não, pois não foi incrementado no escopo atual.

    Se você quiser recuperar o valor utilize a proc sp_executesql passando parâmetros invés do exec(@StrSQL), ou mais fácil ainda, faça como você fez e pegue o último identity da tabela usando   IDENT_CURRENT

    Abraço,



    David Silva MCP | MCTS | ITILF Blog: http://tilive.wordpress.com
    sexta-feira, 6 de janeiro de 2012 17:05

Todas as Respostas

  • Olá Ricardo,

    A Função SCOPE_IDENTITY() retorna o último valor identity inserido na sessão atual, ou seja, se um insert for efetuado em qualquer outra tabela o valor inserido será retornado pela função, pode ser que esteja acontecendo isso no seu caso, foi inserido um registro em outra tabela e quando você faz o select com o retorno da função não é retornado nenhum registro pois o cd_cgoger não existe com o código novo gerado, se nenhum insert identity for efetuado a função irá retornar NULL.

    Já a função IDENT_CURRENT irá lhe retornar o último valor identity inserido na tabela passada no parâmetro.

    Espero ter ajudado.


    David Silva MCP | MCTS | ITILF Blog: http://tilive.wordpress.com
    sexta-feira, 6 de janeiro de 2012 14:22
  • Estou inserindo na tabela atual veja:

    Set

    @StrSql =

    'INSERT INTO TB_CARGO_GERENCIAL ('

     

    IF @cd_cra IS NOT NULL

     

    BEGIN
     

     

    Set @StrSQL = @StrSQL + 'cd_cra,'
     

     

    END

     

     

    IF @ds_cgoger IS NOT NULL

     

    BEGIN
     

     

    Set @StrSQL = @StrSQL + 'ds_cgoger,'
     

     

    END

     

    IF @dt_ini IS NOT NULL

     

    BEGIN

     

    Set @StrSQL = @StrSQL + 'dt_ini,'

     

    END

     

    IF @dt_fim IS NOT NULL

     

    BEGIN

     

    Set @StrSQL = @StrSQL + 'dt_fim,'

     

    END

     

    IF @fl_plr IS NOT NULL

     

    BEGIN

     

    Set @StrSQL = @StrSQL + 'fl_plr,'

     

    END

     

    IF SUBSTRING (@StrSQL,LEN(@StrSQL),1) = ','

     

    BEGIN

     

    Set @StrSQL = SUBSTRING (@StrSQL,1,LEN(@StrSQL) -1 )

     

    END

     

    Set @StrSQL = @StrSQL + ') VALUES ('

     

     

    IF @cd_cra IS NOT NULL

     

    BEGIN

     

    Set @StrSQL = @StrSQL +'''' + LTRIM(STR(@cd_cra)) + ''','

     

    END

     

    IF @ds_cgoger IS NOT NULL

     

    BEGIN

     

    Set @StrSQL = @StrSQL + '''' + @ds_cgoger + ''','

     

    END

     

     

    IF @dt_ini IS NOT NULL

     

    BEGIN

     

    Set @StrSQL = @StrSQL + '''' + convert(varchar(10), @dt_ini,101) + ''','

     

    END

     

    IF @dt_fim IS NOT NULL

     

    BEGIN

     

    Set @StrSQL = @StrSQL + '''' + convert(varchar(10), @dt_fim,101) + ''','

     

    END

     

    IF @fl_plr IS NOT NULL

     

    BEGIN

     

    Set @StrSQL = @StrSQL + '''' + @fl_plr + ''','

     

    END

     

    IF SUBSTRING (@StrSQL,LEN(@StrSQL),1) = ','

     

    BEGIN

     

    Set @StrSQL = SUBSTRING (@StrSQL,1,LEN(@StrSQL) -1 )

     

    END

     

    Set @StrSQL = @StrSQL + ')'

     

     

    EXEC (@StrSQL)
    sexta-feira, 6 de janeiro de 2012 14:59
  • Poste a declaração das variáveis por favor.
    David Silva MCP | MCTS | ITILF Blog: http://tilive.wordpress.com
    sexta-feira, 6 de janeiro de 2012 15:07
  • @cd_cgoger

    smallint = NULL,

    @cd_cra

    smallint,

    @ds_cgoger

    varchar(50),

    @dt_ini

    smalldatetime,

    @dt_fim

    smalldatetime = NULL,

    @fl_plr

    varchar(1)
    sexta-feira, 6 de janeiro de 2012 15:24
  • Ricardo,

    O Comando EXEC está rodando em outro "escopo", por esse motivo a função SCOPE_IDENTITY() retorna NULL quando você executa seu select.

    Para ver o funcionamento faça o seguinte teste no final da sua instrução insert acrescente um select na função, desta forma

     

    SET @StrSQL = @StrSQL + ') ; SELECT SCOPE_IDENTITY()'
    

     


    Você verá que o valor retornado será o do último identity do escopo, no caso, o que foi inserido, porém, acrescente ao final da proc um select na função, você verá que no exec retorna o valor e na consulta fora dele não, pois não foi incrementado no escopo atual.

    Se você quiser recuperar o valor utilize a proc sp_executesql passando parâmetros invés do exec(@StrSQL), ou mais fácil ainda, faça como você fez e pegue o último identity da tabela usando   IDENT_CURRENT

    Abraço,



    David Silva MCP | MCTS | ITILF Blog: http://tilive.wordpress.com
    sexta-feira, 6 de janeiro de 2012 17:05