Trong SQL Server, bạn có thể sử dụng T-SQL @@IDENTITY
chức năng hệ thống để trả về giá trị nhận dạng được chèn lần cuối trong phiên hiện tại.
Lưu ý rằng nó trả về giá trị nhận dạng cuối cùng được tạo trong bất kỳ bảng trong phiên hiện tại . Điều này trái ngược với IDENT_CURRENT()
hàm, trả về giá trị nhận dạng được chèn cuối cùng cho một bảng nhất định .
SCOPE_IDENTITY()
chức năng rất giống với @@IDENTITY
trong đó nó cũng trả về giá trị nhận dạng được chèn lần cuối trong phiên hiện tại. Sự khác biệt là SCOPE_IDENTITY()
được giới hạn trong phạm vi hiện tại.
Ví dụ 1
Đây là ví dụ mã cơ bản của @@IDENTITY
cách sử dụng.
SELECT @@IDENTITY AS [Last-Inserted Identity Value];
Kết quả:
+--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | NULL | +--------------------------------+
Lý do điều này trả về NULL
là do tôi đã mở một phiên mới cho SQL Server và tôi chưa cập nhật cột nhận dạng trong phiên hiện tại của mình.
Dưới đây là một số mã cập nhật một số cột nhận dạng.
CREATE TABLE Cats(id int IDENTITY); CREATE TABLE Dogs(id int IDENTITY); INSERT Cats DEFAULT VALUES; INSERT Cats DEFAULT VALUES; SELECT @@IDENTITY AS [Last-Inserted Identity Value];
Kết quả:
+--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | 2 | +--------------------------------+
Ở đây, tôi tạo một vài bảng, chèn một số dữ liệu, sau đó chọn giá trị nhận dạng hiện tại.
Giá trị nhận dạng hiện tại là 2 vì tôi đã chèn hai hàng vào bảng đó.
Bây giờ, hãy chèn một hàng vào bảng khác:
INSERT Dogs DEFAULT VALUES; SELECT @@IDENTITY AS [Last-Inserted Identity Value];
Kết quả:
+--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | 1 | +--------------------------------+
Giá trị trả về là 1, vì đó là giá trị nhận dạng được chèn cuối cùng cho phiên này.
Ví dụ 2 - So với IDENT_CURRENT ()
Ở đây nó được so sánh với IDENT_CURRENT()
.
SELECT @@IDENTITY AS [@@IDENTITY], IDENT_CURRENT('Cats') AS [IDENT_CURRENT('Cats')], IDENT_CURRENT('Dogs') AS [IDENT_CURRENT('Dogs')];
Kết quả:
+--------------+-------------------------+-------------------------+ | @@IDENTITY | IDENT_CURRENT('Cats') | IDENT_CURRENT('Dogs') | |--------------+-------------------------+-------------------------| | 1 | 2 | 1 | +--------------+-------------------------+-------------------------+
Như đã đề cập, IDENT_CURRENT()
trả về kết quả của nó dựa trên bảng được chỉ định. Do đó, chúng tôi có thể sử dụng nó để tìm các giá trị nhận dạng cuối cùng cho mỗi bảng.
Ví dụ 3 - Chuyển sang Phiên mới
Bây giờ, nếu tôi mở một kết nối mới và chọn @@IDENTITY
một lần nữa, đây là những gì sẽ xảy ra:
USE Test; SELECT @@IDENTITY AS [@@IDENTITY], IDENT_CURRENT('Cats') AS [IDENT_CURRENT('Cats')], IDENT_CURRENT('Dogs') AS [IDENT_CURRENT('Dogs')];
Kết quả:
+--------------+-------------------------+-------------------------+ | @@IDENTITY | IDENT_CURRENT('Cats') | IDENT_CURRENT('Dogs') | |--------------+-------------------------+-------------------------| | NULL | 2 | 1 | +--------------+-------------------------+-------------------------+
@@IDENTITY
kết quả là NULL vì tôi chưa chèn bất kỳ thứ gì vào cột nhận dạng trong phiên mới.
IDENT_CURRENT()
kết quả không phải là NULL, vì kết quả của nó dựa trên bảng - không phải phiên.
@@ IDENTITY so với SCOPE_IDENTITY () so với IDENT_CURRENT ()
Xem IDENT_CURRENT so với @@ IDENTITY và SCOPE_IDENTITY trong SQL Server:Sự khác biệt là gì? cho một ví dụ đơn giản về sự khác biệt giữa ba chức năng này.