Eu quero obter o novo ID criado quando você inserir um novo registro na tabela.
Eu li isto: http://msdn.microsoft.com/en-us/library/ms177564.aspx mas precisa de criar uma tabela temporária.
Quero devolver o ID depois de executar a declaração INSERT (assumindo a execução de apenas um INSERT).
Exemplo:
1 Joe Joe
2 Michael Mike
3 Zoe Zoe
Ao executar uma declaração INSERIR, quero devolver o ID criado, significa 4.
Pode me dizer como fazer isso usando instrução SQL ou não é possível?
Se a sua tabela do SQL Server tem uma coluna do tipo INT IDENTITY
(ou BIGINT IDENTITY
), então você pode obter o último valor inserido utilizando:
INSERT INTO dbo.YourTable(columns....)
VALUES(..........)
SELECT SCOPE_IDENTITY()
Isto funciona desde que você tenha't inserido outra linha - apenas retorna o último valor de IDENTIDADE
entregue neste escopo aqui.
Há pelo menos mais duas opções - @@IDENTITY
e IDENT_CURRENT
- leia mais sobre como elas funcionam e de que forma elas'são diferentes (e podem lhe dar resultados inesperados) neste excelente post de blog por Pinal Dave aqui.
Assumindo uma mesa simples:
CREATE TABLE dbo.foo(ID INT IDENTITY(1,1), name SYSNAME);
Podemos capturar valores de IDENTIDADE
em uma variável de tabela para consumo posterior.
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 deste método é que (a) ele lida com inserções de múltiplas linhas (SCOPE_IDENTITY()
apenas retorna o último valor) e (b) ele evita este bug de paralelismo, que pode levar a resultados errados, mas até agora só foi corrigido no SQL Server 2008 R2 SP1 CU5.
Você pode usar:
SELECT IDENT_CURRENT(‘tablename’)
para aceder à 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’)
Isto resultaria em valores correctos para as tabelas correspondentes.
Ele retorna o último valor IDENTIDADE
produzido em uma tabela, independentemente da conexão que criou o valor, e independentemente do escopo da declaração que produziu o valor.
O IDENT_CURRENT
não está limitado por escopo e sessão; ele está limitado a uma tabela especificada. O IDENT_CURRENT
retorna o valor de identidade gerado para uma tabela específica em qualquer sessão e em qualquer escopo.