Usuário com melhor resposta
SCOPE_IDENTITY()

Pergunta
-
Pessoal tenho uma procedure que no final executa o seguinte comando para recuperar o ID inserido:
Porém não está funcionando quando executo esse funciona:
Alguem sabe o pq disso?
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- Sugerido como Resposta Junior Galvão - MVPMVP sábado, 7 de janeiro de 2012 17:50
- Marcado como Resposta ricardo_david segunda-feira, 9 de janeiro de 2012 13:27
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- Editado David Silva sexta-feira, 6 de janeiro de 2012 14:23
- Sugerido como Resposta Junior Galvão - MVPMVP sábado, 7 de janeiro de 2012 17:49
-
Estou inserindo na tabela atual veja:
Set
@StrSql =
'INSERT INTO TB_CARGO_GERENCIAL ('
-
-
-
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- Sugerido como Resposta Junior Galvão - MVPMVP sábado, 7 de janeiro de 2012 17:50
- Marcado como Resposta ricardo_david segunda-feira, 9 de janeiro de 2012 13:27