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 .
@@IDENTITYGibt 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 1kann zu völlig falschen Ergebnissen führen, wenn die Tabelle einen negativen Identitätsschritt aufweist oder Zeilen mit SET IDENTITY_INSERTim 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 @@IDENTITYund vergewissern Sie sich, dass Sie diejenige verwenden, die das zurückgibt, was Sie tatsächlich benötigen.