Abgesehen von der Leistung haben sie alle unterschiedliche Bedeutungen.
SCOPE_IDENTITY()
Gibt den letzten Identitätswert an, der direkt im aktuellen Bereich in eine Tabelle eingefügt wurde (Bereich = Batch, gespeicherte Prozedur usw., jedoch nicht beispielsweise in einem Trigger, der vom aktuellen Bereich ausgelöst wurde).
IDENT_CURRENT()
gibt Ihnen den letzten Identitätswert , der von einem Benutzer aus einem beliebigen Bereich in eine bestimmte Tabelle eingefügt wurde .
@@IDENTITY
Gibt den letzten Identitätswert an, der von der letzten INSERT-Anweisung für die aktuelle Verbindung generiert wurde, unabhängig von Tabelle oder Bereich. (Randnotiz: Access verwendet diese Funktion und hat daher einige Probleme mit Triggern, die Werte in Tabellen mit Identitätsspalten einfügen.)
Die Verwendung von MAX()
oder TOP 1
kann zu völlig falschen Ergebnissen führen, wenn die Tabelle einen negativen Identitätsschritt aufweist oder Zeilen mit SET IDENTITY_INSERT
im Spiel eingefügt wurden . Hier ist ein Skript, das all dies demonstriert:
CREATE TABLE ReverseIdent (
id int IDENTITY(9000,-1) NOT NULL PRIMARY KEY CLUSTERED,
data char(4)
)
INSERT INTO ReverseIdent (data)
VALUES ('a'), ('b'), ('c')
SELECT * FROM ReverseIdent
SELECT IDENT_CURRENT('ReverseIdent') --8998
SELECT MAX(id) FROM ReverseIdent --9000
SET IDENTITY_INSERT ReverseIdent ON
INSERT INTO ReverseIdent (id, data)
VALUES (9005, 'd')
SET IDENTITY_INSERT ReverseIdent OFF
SELECT IDENT_CURRENT('ReverseIdent') --8998
SELECT MAX(id) FROM ReverseIdent --9005
Zusammenfassung: Halten Sie sich an SCOPE_IDENTITY()
, IDENT_CURRENT()
oder @@IDENTITY
und vergewissern Sie sich, dass Sie diejenige verwenden, die das zurückgibt, was Sie tatsächlich benötigen.