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

Sử dụng SCOPE_IDENTITY () để trả lại Giá trị nhận dạng được chèn lần cuối trong cùng một phạm vi (Máy chủ SQL)

Trong SQL Server, bạn có thể sử dụng T-SQL SCOPE_IDENTITY() hàm để trả về giá trị nhận dạng cuối cùng được chèn vào cột nhận dạng trong cùng phạm vi.

Phạm vi là một mô-đun (thủ tục được lưu trữ, trình kích hoạt, chức năng hoặc lô). Nếu hai câu lệnh nằm trong cùng một thủ tục, hàm hoặc lô được lưu trữ, chúng ở cùng một phạm vi.

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 nào 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 , bất kể đó là phiên nào.

SCOPE_IDENTITY() rất giống với @@IDENTITY trong đó cả hai đều 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() bị giới hạn trong phạm vi hiện tại, trong khi @@IDENTITY không giới hạn trong một phạm vi cụ thể.

Ví dụ 1 - Cách sử dụng cơ bản

Đây là một ví dụ mã cơ bản về cách nó hoạt động.

SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];

Kết quả:

+--------------------------------+
| Last-Inserted Identity Value   |
|--------------------------------|
| NULL                           |
+--------------------------------+

Lý do cho kết quả NULL là vì tôi đã chạy câu lệnh ngay sau khi mở kết nối mới đến SQL Server. SCOPE_IDENTITY() hàm chỉ trả về kết quả từ phiên hiện tại.

Vì vậy, để nhận được kết quả không phải NULL, tôi cần phải chèn một giá trị vào cột nhận dạng.

Ví dụ 2 - Chèn giá trị cho kết quả không phải NULL

Trong ví dụ này, tôi tạo một bảng có cột nhận dạng. Sau đó, tôi chèn một giá trị mặc định vào bảng đó trước khi chọn nội dung của bảng và sau đó chạy SCOPE_IDENTITY() một lần nữa.

CREATE TABLE scope_identity_test(id int IDENTITY(1,1));
INSERT scope_identity_test DEFAULT VALUES;
SELECT id FROM scope_identity_test;
SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];

Kết quả:

+------+
| id   |
|------|
| 1    |
+------+
(1 row affected)
+--------------------------------+
| Last-Inserted Identity Value   |
|--------------------------------|
| 1                              |
+--------------------------------+
(1 row affected)

Bảng có một hàng và cột nhận dạng của nó có giá trị là 1. Đây là giá trị nhận dạng được chèn cuối cùng cho phiên hiện tại và vì vậy SCOPE_IDENTITY() cũng trả về 1.

Bây giờ nếu tôi thêm một hàng khác, giá trị sẽ tăng lên tương ứng:

INSERT scope_identity_test DEFAULT VALUES;
SELECT id FROM scope_identity_test;
SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];

Kết quả:

+------+
| id   |
|------|
| 1    |
| 2    |
+------+
(2 rows affected)
+--------------------------------+
| Last-Inserted Identity Value   |
|--------------------------------|
| 2                              |
+--------------------------------+
(1 row affected)

Kết quả từ một phiên mới

Như đã đề cập, SCOPE_IDENTITY() chỉ trả về kết quả từ cùng một phiên. Điều này cũng đúng với @@IDENTITY .

Vì vậy, nếu tôi mở một kết nối mới tới SQL Server và chạy SELECT trước đó một lần nữa, tôi nhận được kết quả sau:

USE Test;
SELECT id FROM scope_identity_test;
SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];

Kết quả:

+------+
| id   |
|------|
| 1    |
| 2    |
+------+
(2 rows affected)
+--------------------------------+
| Last-Inserted Identity Value   |
|--------------------------------|
| NULL                           |
+--------------------------------+
(1 row affected)

Bây giờ, hãy chèn một hàng mới từ trong phiên mới này:

INSERT scope_identity_test DEFAULT VALUES;
SELECT id FROM scope_identity_test;
SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];

Kết quả:

+------+
| id   |
|------|
| 1    |
| 2    |
| 3    |
+------+
(1 row affected)
+--------------------------------+
| Last-Inserted Identity Value   |
|--------------------------------|
| 3                              |
+--------------------------------+
(3 rows affected)

Vì vậy, nó bắt kịp ngay khi tôi chèn một giá trị nhận dạng mới.

Tuy nhiên, hãy chuyển về phiên ban đầu và chạy SELECT câu lệnh một lần nữa (mà không chèn một hàng mới):

SELECT id FROM scope_identity_test;
SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];

Kết quả:

+------+
| id   |
|------|
| 1    |
| 2    |
| 3    |
+------+
(3 rows affected)
+--------------------------------+
| Last-Inserted Identity Value   |
|--------------------------------|
| 2                              |
+--------------------------------+
(1 row affected)

Vì vậy, SCOPE_IDENTITY() của phiên ban đầu kết quả không bị ảnh hưởng bởi phiên thứ hai.

Thêm phạm vi thứ hai

Điều khác biệt SCOPE_IDENTITY() từ @@IDENTITY , đó có phải là SCOPE_IDENTITY() không được giới hạn trong phạm vi hiện tại.

Ví dụ:nếu bảng có trình kích hoạt chèn giá trị nhận dạng vào một bảng khác, SCOPE_IDENTITY() sẽ chỉ báo cáo giá trị nhận dạng đầu tiên. Nó sẽ bỏ qua giá trị nhận dạng cho bảng thứ hai vì giá trị đó được tạo trong một phạm vi khác @@IDENTITY mặt khác, sẽ báo cáo giá trị nhận dạng cho bảng thứ hai (vì nó bao gồm tất cả các phạm vi).

Để biết ví dụ về ý tôi, hãy xem IDENT_CURRENT so với @@ IDENTITY so với SCOPE_IDENTITY trong SQL Server:Sự khác biệt là gì?

Bài viết đó đi qua một ví dụ về trình kích hoạt giống như những gì tôi đang nói ở đâ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. chỉ nhóm sql theo các hàng theo trình tự

  2. Cách kiểm tra cài đặt cấu hình cho thư cơ sở dữ liệu trong SQL Server (T-SQL)

  3. Lưu trữ dữ liệu UTF-16 / Unicode trong SQL Server

  4. Không thể tìm thấy Assembly 'Microsoft.SqlServer.Types' phiên bản 10 trở lên

  5. Nhận tất cả các bậc cha mẹ cho một đứa trẻ