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.