Крім продуктивності, всі вони мають досить різні значення.
SCOPE_IDENTITY()
дасть вам останнє значення ідентичності, вставлене у будь-яку таблицю безпосередньо в поточному діапазоні (область = пакет, збережена процедура тощо, але не в межах, скажімо, тригера, який був запущений поточним діапазоном).
IDENT_CURRENT()
дасть вам останнє значення ідентичності, вставлене у конкретну таблицю з будь-якої області, будь-яким користувачем.
@@IDENTITY
дає останнє значення ідентичності, згенерованого останнім оператором INSERT для поточного з'єднання, незалежно від таблиці чи області застосування. (Бічна примітка: Access використовує цю функцію, і тому виникають деякі проблеми з тригерами, які вставляють значення в таблиці з стовпцями ідентичності.)
Використання MAX()
або TOP 1
може дати вам абсолютно неправильні результати, якщо в таблиці є крок негативної ідентичності, або у неї були вставлені рядки з SET IDENTITY_INSERT
програванням. Ось сценарій, що демонструє все це:
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
Резюме: палиця SCOPE_IDENTITY()
, IDENT_CURRENT()
або @@IDENTITY
, і переконайтеся , що ви використовуєте той , який повертає то , що ви на самому справі потрібно.