Ottieni l’ultimo ID riga inserito (con istruzione SQL)

Voglio ottenere il nuovo ID creato quando inserisci un nuovo record nella tabella.

Ho letto questo: http://msdn.microsoft.com/en-us/library/ms177564.aspx ma ha bisogno di creare una tabella temporanea.

Voglio restituire l’ID dopo aver eseguito l’istruzione INSERT (assumendo l’esecuzione di un solo INSERT).

Esempio:

1 Joe Joe 2 Michael Mike 3 Zoe Zoe 

Quando si esegue un’istruzione INSERT, voglio restituire l’ID creato, significa 4.

Puoi dirmi come farlo usando l’istruzione SQL o non è ansible?

Se la tabella di SQL Server ha una colonna di tipo INT IDENTITY (o BIGINT IDENTITY ), è ansible ottenere l’ultimo valore inserito utilizzando:

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

Questo funziona fintanto che non hai inserito un’altra riga: restituisce solo l’ultimo valore di IDENTITY distribuito in questo ambito qui.

Ci sono almeno altre due opzioni – @@IDENTITY e IDENT_CURRENT – leggi di più su come funzionano e in che modo sono diversi (e potrebbero darti risultati inaspettati) in questo eccellente post sul blog di Pinal Dave qui .

Supponendo una tabella semplice:

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

Possiamo acquisire valori di IDENTITY in una variabile di tabella per un ulteriore consumo.

 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; 

La cosa bella di questo metodo è (a) gestisce gli inserimenti multi-riga ( SCOPE_IDENTITY() restituisce solo l’ultimo valore) e (b) evita questo bug di parallelismo , che può portare a risultati errati , ma finora è stato risolto solo in SQL Server 2008 R2 SP1 CU5.

Puoi usare:

 SELECT IDENT_CURRENT('tablename') 

per accedere all’ultima id quadro per una tabella perticolare.

Ad esempio considerando il seguente codice:

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

Ciò darebbe al valore corretto per le tabelle corrispondenti.

Restituisce l’ultimo valore IDENTITY prodotto in una tabella, indipendentemente dalla connessione che ha creato il valore e indipendentemente dall’ambito dell’istruzione che ha prodotto il valore.

IDENT_CURRENT non è limitato dall’ambito e dalla sessione; è limitato a una tabella specificata. IDENT_CURRENT restituisce il valore dell’id quadro generato per una tabella specifica in qualsiasi sessione e qualsiasi ambito.