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 .
@@IDENTITY
memberi 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 1
dapat memberi Anda hasil yang sepenuhnya salah jika tabel memiliki langkah identitas negatif, atau baris-baris yang dimasukkan SET IDENTITY_INSERT
dalam 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.