IDENT_CURRENT (Transact-SQL)
Restituisce l'ultimo valore Identity generato per una tabella o una vista specificata. L'ultimo valore Identity generato può essere per qualsiasi sessione e qualsiasi ambito.
Sintassi
IDENT_CURRENT( 'table_name' )
Argomenti
- table_name
Nome della tabella per la quale viene restituito il valore Identity. table_name è di tipo varchar e non prevede alcun valore predefinito.
Tipi restituiti
numeric(38,0)
Eccezioni
Restituisce NULL in caso di errore o se un chiamante non dispone dell'autorizzazione necessaria per visualizzare l'oggetto.
In SQL Server un utente può visualizzare esclusivamente i metadati delle entità a protezione diretta di cui è proprietario o per cui ha ricevuto un'autorizzazione. Di conseguenza, le funzioni predefinite di creazione dei metadati come IDENT_CURRENT possono restituire NULL se l'utente non dispone di alcuna autorizzazione per l'oggetto. Per ulteriori informazioni, vedere Configurazione della visibilità dei metadati e Risoluzione dei problemi relativi alla visibilità dei metadati.
Osservazioni
IDENT_CURRENT è simile alle funzioni per valori Identity SCOPE_IDENTITY e @@IDENTITY di SQL Server 2000. Queste tre funzioni restituiscono infatti gli ultimi valori Identity generati. L'unica differenza tra le funzioni è rappresentata dall'ambito e dalla sessioneconsiderati.
La funzione IDENT_CURRENT restituisce l'ultimo valore Identity generato per una tabella specifica in qualsiasi sessione e in qualsiasi ambito.
La funzione @@IDENTITY restituisce l'ultimo valore Identity generato per qualsiasi tabella della sessione corrente in tutti gli ambiti.
La funzione SCOPE_IDENTITY restituisce l'ultimo valore Identity generato per qualsiasi tabella della sessione e dell'ambito correnti.
Quando il valore IDENT_CURRENT è NULL, perché la tabella non conteneva righe oppure è stata troncata, la funzione IDENT_CURRENT restituisce il valore di inizializzazione.
In seguito a errori di esecuzione di istruzioni e transazioni, è possibile che il valore Identity corrente di una tabella venga modificato con la conseguente creazione di gap nei valori della colonna Identity. Non viene mai eseguito il rollback del valore Identity, anche se non si esegue il commit della transazione che ha tentato l'inserimento del valore nella tabella. Ad esempio, se un'istruzione INSERT non viene completata a causa di una violazione IGNORE_DUP_KEY, il valore Identity corrente per la tabella viene comunque incrementato.
Prestare attenzione quando si utilizza IDENT_CURRENT per stimare il successivo valore Identity generato. È possibile che il valore generato effettivo sia diverso dalla somma di IDENT_CURRENT e IDENTITY_INCR a causa di inserimenti eseguiti da altre sessioni.
Esempi
A. Restituzione dell'ultimo valore Identity generato per una tabella specificata
Nell'esempio seguente viene restituito l'ultimo valore Identity generato per la tabella Person.Address nel database AdventureWorks.
USE AdventureWorks;
GO
SELECT IDENT_CURRENT ('Person.Address') AS Current_Identity;
GO
B. Confronto dei valori Identity restituiti da IDENT_CURRENT, @@IDENTITY e SCOPE_IDENTITY
Nell'esempio seguente vengono illustrati i diversi valori Identity restituiti dalle funzioni IDENT_CURRENT, @@IDENTITY e SCOPE_IDENTITY.
USE AdventureWorks;
GO
IF OBJECT_ID(N't6', N'U') IS NOT NULL
DROP TABLE t6;
GO
IF OBJECT_ID(N't7', N'U') IS NOT NULL
DROP TABLE t7;
GO
CREATE TABLE t6(id int IDENTITY);
CREATE TABLE t7(id int IDENTITY(100,1));
GO
CREATE TRIGGER t6ins ON t6 FOR INSERT
AS
BEGIN
INSERT t7 DEFAULT VALUES
END;
GO
--End of trigger definition
SELECT id FROM t6;
--id is empty.
SELECT id FROM t7;
--ID is empty.
--Do the following in Session 1
INSERT t6 DEFAULT VALUES;
SELECT @@IDENTITY;
/*Returns the value 100. This was inserted by the trigger.*/
SELECT SCOPE_IDENTITY();
/* Returns the value 1. This was inserted by the
INSERT statement two statements before this query.*/
SELECT IDENT_CURRENT('t7');
/* Returns value inserted into t7, that is in the trigger.*/
SELECT IDENT_CURRENT('t6');
/* Returns value inserted into t6. This was the INSERT statement four statements before this query.*/
-- Do the following in Session 2.
SELECT @@IDENTITY;
/* Returns NULL because there has been no INSERT action
up to this point in this session.*/
SELECT SCOPE_IDENTITY();
/* Returns NULL because there has been no INSERT action
up to this point in this scope in this session.*/
SELECT IDENT_CURRENT('t7');
/* Returns the last value inserted into t7.*/