2012-11-19 7 views
15

Googled questo problema una settimana e nessuna cosa utile Credo che non sto usando la parola correttaCome ottenere il valore di auto-incremento di ultima fila a l'inserto

Sto usando SQL Server 2008 con T-SQL e il mio bisogno è di ottimizzare la mia funzione quando inserisco una nuova riga.

ho una tabella con prima colonna è la chiave di tipo intero autoincremento e altre colonne sono solo per le informazioni

Quando facciamo un inserto, SQL Server incrementa la chiave automaticamente e devo fare un select max a ottenere il valore, quindi c'è un modo come una variabile globale come @@IDENTITY o una funzione per evitare l'inizio delle transazioni finale e selezionare max

risposta

29

Uso SCOPE_IDENTITY:

-- do insert 

SELECT SCOPE_IDENTITY(); 

che sarà dati:

L'ultimo valore di identità inserito in una colonna Identity in lo stesso ambito. Un ambito è un modulo: stored procedure, trigger, funzione o batch. Pertanto, due istruzioni sono nello stesso ambito se si trovano nella stessa stored procedure, funzione o batch.

-1
SELECT IDENT_CURRENT(‘tablename’) 

Esso restituisce l'ultimo valore IDENTITY prodotto in una tabella, indipendentemente dalla connessione che ha creato il valore, e indipendentemente dalla portata della dichiarazione 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'identità generato per una tabella specifica in qualsiasi sessione e qualsiasi ambito.

Tratto da: http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

O questo:

INSERT INTO Persons (FirstName) VALUES ('Joe'); 
SELECT ID AS LastID FROM Persons WHERE ID = @@Identity; 

Tratto da: http://network.convergenceservices.in/forum/22-ms-sql/384-get-last-inserted-record-id-in-ms-sql.html

+0

L'unico problema con "SCOPE_IDENTITY" è che restituisce l'ultimo valore ID prodotto su qualsiasi tabella. IMO conoscerai sempre il nome della tabella in cui hai inserito o manipolato i dati e vorresti solo ritirare i dati da tale tabella: cintura e parentesi graffe. – Paul

+0

Dal collegamento fai riferimento: "usa sempre SCOPE_IDENTITY()". È molto più probabile che tu voglia conoscere l'ID del record che hai inserito, non l'ultimo record. – podiluska

2

che dire questo per ultima auto valore di incremento

SELEZIONA IDENT_CURRENT ('table_name') -IDENT_INCR ('table_name')

4

appena eseguito il codice:

INSERT INTO Persons (FirstName) VALUES ('Joe'); 
SELECT ID AS LastID FROM Persons WHERE ID = @@Identity; 

e funziona anche!

+2

Cosa sta succedendo se da un altro thread fai un altro inserimento tra queste due query? – user2983041

0

Se si sta utilizzando MySQL si ottiene l'ID di incremento automatico dell'ultimo inserto con:

SELECT LAST_INSERT_ID();

Vedi here per riferimento completo.

0

Nel mio caso ho dovuto usare @@ Identity, perché stavo inserendo in una vista. Sembra che SCOPE_IDENTITY funzioni solo per quelli che hai creato in modo esplicito.

Vedi qui:

http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

@@ IDENTITY restituirà l'ultimo valore identity inserito in una tabella in la sessione corrente. Mentre @@ IDENTITY è limitato alla sessione corrente , non è limitato all'ambito corrente. Se su una tabella è presente un trigger che consente di creare un'identità in un'altra tabella, è possibile ottenere l'identità creata per ultima, anche se era il trigger che lo ha creato.

Problemi correlati