Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Sử dụng @@ IDENTITY để trả lại giá trị nhận dạng được chèn lần cuối trong SQL Server

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Có cách nào để chèn hoặc cập nhật SQLBulkCopy nếu tồn tại không?

  2. Nhóm SQL BY, N mục hàng đầu cho mỗi Nhóm

  3. Câu lệnh SQL GROUP BY CASE với hàm tổng hợp

  4. Làm cách nào để xóa dấu và tất cả các ký tự <> a..z trong sql-server?

  5. Thay thế chức năng trễ dẫn trong SQL Server 2008