IDENT_CURRENT (Transact-SQL)
Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure
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.
Convenzioni relative alla sintassi Transact-SQL
Sintassi
IDENT_CURRENT( 'table_or_view' )
Argomenti
table_or_view
Nome della tabella o della vista per la quale viene restituito il valore Identity. table_or_view è di tipo varchar e non prevede alcun valore predefinito.
Tipi restituiti
numeric(@@MAXPRECISION,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 sicurezza 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 altre informazioni, vedere Metadata Visibility Configuration.
Osservazioni:
IDENT_CURRENT è simile alle funzioni per valori Identity SCOPE_IDENTITY e @@IDENTITY di SQL Server 2000 (8.x). Queste tre funzioni restituiscono infatti gli ultimi valori Identity generati. Tuttavia, l'ambito e la sessione in cui ultimo è definito in ciascuna di queste funzioni differiscono:
- La funzione IDENT_CURRENT restituisce l'ultimo valore Identity generato per una tabella specifica in qualsiasi sessione e in qualsiasi ambito.
- @@IDENTITY restituisce l'ultimo valore Identity generato per qualsiasi tabella nella 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.
Le istruzioni e le transazioni con esito negativo sono in grado di modificare i dati Identity correnti di una tabella e creare 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. Se, ad esempio, un'istruzione INSERT ha esito negativo a causa di una violazione di IGNORE_DUP_KEY, il valore Identity corrente per la tabella viene comunque incrementato.
Quando si usa IDENT_CURRENT su una vista che contiene join, viene restituito NULL, a prescindere dal fatto che una o più delle tabelle unite in join abbiano una colonna Identity.
Importante
Prestare attenzione quando si usa IDENT_CURRENT per stimare il successivo valore Identity generato. È possibile che il valore generato effettivo sia diverso dalla somma di IDENT_CURRENT e IDENT_INCR a causa di inserimenti effettuati da altre sessioni.
Esempi
R. 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 AdventureWorks2022
.
USE AdventureWorks2022;
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 AdventureWorks2022;
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;
--IDs 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.*/
Vedi anche
@@IDENTITY (Transact-SQL)
SCOPE_IDENTITY (Transact-SQL)
IDENT_INCR (Transact-SQL)
IDENT_SEED (Transact-SQL)
Espressioni (Transact-SQL)
Funzioni di sistema (Transact-SQL)