IDENT_CURRENT (Transact-SQL)
Gibt den letzten für eine angegebene Tabelle oder Sicht generierten Identitätswert zurück. Der letzte generierte Identitätswert kann sich auf eine beliebige Sitzung und einen beliebigen Gültigkeitsbereich beziehen.
Transact-SQL-Syntaxkonventionen
Syntax
IDENT_CURRENT( 'table_name' )
Argumente
- table_name
Der Name der Tabelle, deren Identitätswert zurückgegeben wird. table_name ist vom Datentyp varchar und hat keinen Standardwert.
Rückgabetypen
numeric(38,0)
Ausnahmen
Gibt NULL bei einem Fehler zurück oder wenn ein Aufrufer nicht über Berechtigungen zum Anzeigen des Objekts verfügt.
In SQL Server kann ein Benutzer nur die Metadaten sicherungsfähiger Elemente anzeigen, bei denen der Benutzer entweder der Besitzer ist oder für die dem Benutzer eine Berechtigung erteilt wurde. Dies bedeutet, dass Metadaten ausgebende integrierte Funktionen, z. B. IDENT_INCR, möglicherweise NULL zurückgeben, wenn dem Benutzer für das Objekt keine Berechtigung erteilt wurde. Weitere Informationen finden Sie unter Konfigurieren der Sichtbarkeit von Metadaten.
Hinweise
IDENT_CURRENT ähnelt den Identitätsfunktionen SCOPE_IDENTITY und @@IDENTITY von SQL Server 2000. Alle drei Funktionen geben die zuletzt generierten Identitätswerte zurück. Der Gültigkeitsbereich und die Sitzung, für die zuletzt definiert ist, unterscheiden sich jedoch bei jeder dieser drei Funktionen:
IDENT_CURRENT gibt den letzten für eine bestimmte Tabelle in einer Sitzung oder einem Gültigkeitsbereich generierten Identitätswert zurück.
@@IDENTITY gibt den letzten Identitätswert zurück, der für eine Tabelle in der aktuellen Sitzung in allen Gültigkeitsbereichen generiert wurde.
SCOPE_IDENTITY gibt den letzten Identitätswert zurück, der für eine Tabelle in der aktuellen Sitzung im aktuellen Gültigkeitsbereich generiert wurde.
Wenn der IDENT_CURRENT-Wert NULL ist (da die Tabelle keine Zeilen enthielt oder abgeschnitten wurde), gibt die IDENT_CURRENT-Funktion den Ausgangswert zurück.
Fehler bei Anweisungen und Transaktionen können die aktuelle Identität einer Tabelle ändern und Lücken in den Identitätsspaltenwerten verursachen. Für den Identitätswert erfolgt kein Rollback, auch wenn für die Transaktion, die versuchte, den Wert in die Tabelle einzufügen, kein Commit ausgeführt wird. Beispiel: Wenn eine INSERT-Anweisung aufgrund einer Verletzung von IGNORE_DUP_KEY einen Fehler erzeugt, wird der aktuelle Identitätswert trotzdem inkrementiert.
IDENT_CURRENT ist nur bedingt geeignet, um den nächsten generierten Identitätswert vorherzusagen. Der tatsächlich generierte Wert kann sich aufgrund von Einfügungen durch andere Sitzungen von IDENT_CURRENT plus IDENT_INCR unterscheiden.
Beispiele
A.Zurückgeben des letzten für eine angegebene Tabelle generierten Identitätswertes
Im folgenden Beispiel wird der letzte Identitätswert zurückgegeben, der für die Person.Address-Tabelle in der AdventureWorks2012-Datenbank generiert wurde.
USE AdventureWorks2012;
GO
SELECT IDENT_CURRENT ('Person.Address') AS Current_Identity;
GO
B.Vergleichen der von IDENT_CURRENT, @@IDENTITY und SCOPE_IDENTITY zurückgegebenen Identitätswerte
Das folgende Beispiel zeigt verschiedene Identitätswerte, die von IDENT_CURRENT, @@IDENTITY und SCOPE_IDENTITY zurückgegeben werden.
USE AdventureWorks2012;
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.*/