Ngoài hiệu suất, tất cả đều có ý nghĩa khá khác nhau.
SCOPE_IDENTITY()
sẽ cung cấp cho bạn giá trị nhận dạng cuối cùng được chèn vào bất kỳ bảng nào trong phạm vi hiện tại (scope = batch, thủ tục được lưu trữ, v.v. nhưng không phải trong phạm vi, giả sử, một kích hoạt đã được kích hoạt bởi phạm vi hiện tại).
IDENT_CURRENT()
sẽ cung cấp cho bạn giá trị nhận dạng cuối cùng được chèn vào một bảng cụ thể từ bất kỳ phạm vi nào , bởi bất kỳ người dùng nào .
@@IDENTITY
cung cấp cho bạn giá trị nhận dạng cuối cùng được tạo bởi câu lệnh INSERT gần đây nhất cho kết nối hiện tại, bất kể bảng hoặc phạm vi. (Lưu ý bên: Access sử dụng chức năng này và do đó có một số vấn đề với trình kích hoạt chèn giá trị vào các bảng có cột nhận dạng.)
Sử dụng MAX()
hoặc TOP 1
có thể cung cấp cho bạn kết quả hoàn toàn sai nếu bảng có bước nhận dạng âm hoặc có các hàng được chèn SET IDENTITY_INSERT
trong khi chơi. Đây là một kịch bản thể hiện tất cả những điều này:
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
Tóm tắt: gắn bó với SCOPE_IDENTITY()
, IDENT_CURRENT()
hoặc @@IDENTITY
, và đảm bảo bạn đang sử dụng một thứ trả về những gì bạn thực sự cần.