Estou tentando recuperar o valor-chave após uma instrução INSERT. Exemplo: eu tenho uma tabela com os atributos nome e id. id é um valor gerado.
INSERT INTO table (name) VALUES('bob');
Agora, quero recuperar o ID na mesma etapa. Como isso é feito?
Estamos usando o Microsoft SQL Server 2008.
sql
sql-server
sql-server-2008
melbic
fonte
fonte
Respostas:
Não há necessidade de um SELECT separado ...
Isso funciona também para colunas que não são IDENTITY (como GUIDs)
fonte
Use
SCOPE_IDENTITY()
para obter o novo valor de IDhttp://msdn.microsoft.com/en-us/library/ms190315.aspx
fonte
id
é a identidadeid
, então sim.É a aposta mais segura, pois há um problema conhecido no conflito da cláusula OUTPUT em tabelas com gatilhos. Torna isso bastante confiável, mesmo que sua tabela não tenha atualmente nenhum gatilho - alguém adicionando um abaixo da linha quebrará seu aplicativo. Time Bomb tipo de comportamento.
Veja o artigo msdn para uma explicação mais detalhada:
http://blogs.msdn.com/b/sqlprogrammability/archive/2008/07/11/update-with-output-clause-triggers-and-sqlmoreresults.aspx
fonte
O Entity Framework executa algo semelhante à resposta do gbn:
Os resultados da saída são armazenados em uma variável de tabela temporária e depois selecionados de volta ao cliente. Precisa estar ciente da pegadinha:
Não tenho idéia de por que a EF uniria a tabela efêmera de volta à tabela real (em que circunstâncias as duas não coincidiriam).
Mas é isso que a EF faz.
SQL Server 2008 ou apenas mais recente. Se for 2005, então você está sem sorte.
fonte
Customer
registro inserido , pois pode haver outra lógica do lado do banco de dados afetando-o, por exemplo,DEFAULT
em algumas colunas, gatilhos na tabela, etc. entidade (objeto) usada para a inserção, para que o lado do cliente obtenha o objeto do cliente com o ID e tudo o mais que representa o estado atual da linha.@@IDENTITY
É uma função do sistema que retorna o último valor de identidade inserido.fonte
Existem várias maneiras de sair após a inserção
IDENT_CURRENT : retorna a última identidade criada para uma tabela ou exibição específica em qualquer sessão.
SCOPE_IDENTITY : retorna a última identidade de uma mesma sessão e do mesmo escopo. Um escopo é um procedimento armazenado / gatilho etc.
IDENTIDADE : Retorna a última identidade da mesma sessão.
fonte
out put
parabulk insert
e inserção porselect statement
. obrigado sua sugestãoA melhor e mais segura solução está sendo usada
SCOPE_IDENTITY()
.Você só precisa obter a identidade do escopo após cada inserção e salvá-la em uma variável, pois é possível chamar duas inserções no mesmo escopo.
ident_current
e@@identity
pode ser que eles funcionem, mas não têm escopo seguro. Você pode ter problemas em um grande aplicativoMais detalhes estão aqui Microsoft docs
fonte
select @duplicataId = SCOPE_IDENTITY()
OUTPUT
cláusula é uma solução melhor, mais puro :)Você pode usar
scope_identity()
para selecionar o ID da linha que você acabou de inserir em uma variável e selecionar as colunas que desejar na tabela em que o id = a identidade que você obtevescope_identity()
Consulte aqui as informações do MSDN http://msdn.microsoft.com/en-us/library/ms190315.aspx
fonte
Existem várias maneiras de obter o último ID inserido após o comando insert.
@@IDENTITY
: Retorna o último valor de identidade gerado em uma conexão na sessão atual, independentemente da tabela e do escopo da instrução que produziu o valorSCOPE_IDENTITY()
: Retorna o último valor de identidade gerado pela instrução insert no escopo atual da conexão atual, independentemente da tabela.IDENT_CURRENT(‘TABLENAME’)
: Retorna o último valor de identidade gerado na tabela especificada, independentemente de qualquer conexão, sessão ou escopo. IDENT_CURRENT não é limitado por escopo e sessão; está limitado a uma tabela especificada.Agora parece mais difícil decidir qual será a correspondência exata para minha exigência.
Eu prefiro SCOPE_IDENTITY ().
Se você usar selecionar SCOPE_IDENTITY () junto com TableName na instrução insert, obterá o resultado exato conforme sua expectativa.
Fonte: CodoBee
fonte
É assim que eu uso OUTPUT INSERTED, ao inserir em uma tabela que usa ID como coluna de identidade no SQL Server:
fonte
Você pode anexar uma instrução de seleção à sua instrução de inserção. Número inteiro myInt = Insere valores da tabela1 (FName) ('Fred'); Selecione Scope_Identity (); Isso retornará um valor da identidade quando o scaler executado.
fonte
Depois de inserir uma tabela com uma coluna de identidade, você pode fazer referência a @@ IDENTITY para obter o valor: http://msdn.microsoft.com/en-us/library/aa933167%28v=sql.80%29.aspx
fonte
* A ordem dos parâmetros na cadeia de conexão às vezes é importante. * A localização do parâmetro Provider pode interromper o cursor do conjunto de registros após adicionar uma linha. Vimos esse comportamento com o provedor SQLOLEDB.
Depois que uma linha é adicionada, os campos da linha não estão disponíveis, a menos que o provedor seja especificado como o primeiro parâmetro na cadeia de conexão. Quando o provedor estiver em qualquer lugar da cadeia de conexão, exceto como o primeiro parâmetro, os campos de linha recém-inseridos não estarão disponíveis. Quando movemos o provedor para o primeiro parâmetro, os campos da linha apareceram magicamente.
fonte