Terlepas dari kinerja, mereka semua memiliki makna yang agak berbeda.
SCOPE_IDENTITY()akan memberi Anda nilai identitas terakhir yang dimasukkan ke dalam tabel apa pun secara langsung dalam lingkup saat ini (lingkup = kumpulan, prosedur tersimpan, dll. tetapi tidak di dalam, katakanlah, pemicu yang dipicu oleh cakupan saat ini).
IDENT_CURRENT()akan memberi Anda nilai identitas terakhir yang dimasukkan ke tabel tertentu dari ruang lingkup apa pun , oleh pengguna mana pun .
@@IDENTITYmemberi Anda nilai identitas terakhir yang dihasilkan oleh pernyataan INSERT terbaru untuk koneksi saat ini, terlepas dari tabel atau ruang lingkup. (Catatan: Akses menggunakan fungsi ini, dan karenanya memiliki beberapa masalah dengan pemicu yang memasukkan nilai ke dalam tabel dengan kolom identitas.)
Menggunakan MAX()atau TOP 1dapat memberi Anda hasil yang sepenuhnya salah jika tabel memiliki langkah identitas negatif, atau baris-baris yang dimasukkan SET IDENTITY_INSERTdalam permainan. Berikut ini skrip yang menunjukkan semua ini:
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
Ringkasan: tetap dengan SCOPE_IDENTITY(),, IDENT_CURRENT()atau @@IDENTITY, dan pastikan Anda menggunakan yang mengembalikan apa yang sebenarnya Anda butuhkan.