Obtenha o último ID de linha inserido (com a instrução SQL)

Eu quero obter o novo ID criado quando você insere um novo registro na tabela.

Eu li isso: http://msdn.microsoft.com/en-us/library/ms177564.aspx mas precisa criar uma tabela temporária.

Eu quero retornar o ID depois de executar a instrução INSERT (assumindo a execução de apenas um INSERT).

Exemplo:

1 Joe Joe 2 Michael Mike 3 Zoe Zoe 

Ao executar uma instrução INSERT, quero retornar o ID criado, significa 4.

Pode me dizer como fazer isso usando a instrução SQL ou não é possível?

Se a tabela do SQL Server tiver uma coluna do tipo INT IDENTITY (ou BIGINT IDENTITY ), você poderá obter o valor inserido mais recente usando:

 INSERT INTO dbo.YourTable(columns....) VALUES(..........) SELECT SCOPE_IDENTITY() 

Isso funciona desde que você não tenha inserido outra linha – apenas retorna o último valor IDENTITY fornecido neste escopo aqui.

Há pelo menos mais duas opções – @@IDENTITY e IDENT_CURRENT – leia mais sobre como elas funcionam e de que maneira elas são diferentes (e podem lhe dar resultados inesperados) neste excelente post de blog de Pinal Dave aqui .

Assumindo uma tabela simples:

 CREATE TABLE dbo.foo(ID INT IDENTITY(1,1), name SYSNAME); 

Podemos capturar valores de IDENTITY em uma variável de tabela para consumo adicional.

 DECLARE @IDs TABLE(ID INT); -- minor change to INSERT statement; add an OUTPUT clause: INSERT dbo.foo(name) OUTPUT inserted.ID INTO @IDs(ID) SELECT N'Fred' UNION ALL SELECT N'Bob'; SELECT ID FROM @IDs; 

O bom desse método é (a) ele manipula inserções de várias linhas ( SCOPE_IDENTITY() retorna apenas o último valor) e (b) evita esse bug de paralelismo , o que pode levar a resultados errados , mas até agora só é corrigido em SQL Server 2008 R2 SP1 CU5.

Você pode usar:

 SELECT IDENT_CURRENT('tablename') 

para acessar a identidade mais recente de uma tabela perticular.

Por exemplo, considerando o seguinte código:

 INSERT INTO dbo.MyTable(columns....) VALUES(..........) INSERT INTO dbo.YourTable(columns....) VALUES(..........) SELECT IDENT_CURRENT('MyTable') SELECT IDENT_CURRENT('YourTable') 

Isso renderia para corrigir o valor para tabelas correspondentes.

Ele retorna o último valor IDENTITY produzido em uma tabela, independentemente da conexão que criou o valor e independentemente do escopo da instrução que produziu o valor.

IDENT_CURRENT não está limitado por escopo e session; está limitado a uma tabela especificada. IDENT_CURRENT retorna o valor de identidade gerado para uma tabela específica em qualquer session e qualquer escopo.