Bagikan melalui


SCOPE_IDENTITY (T-SQL)

Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance

Mengembalikan nilai identitas terakhir yang dimasukkan ke dalam kolom identitas dalam cakupan yang sama. Cakupan adalah modul: prosedur tersimpan, pemicu, fungsi, atau batch. Oleh karena itu, jika dua pernyataan berada dalam prosedur tersimpan, fungsi, atau batch yang sama, mereka berada dalam cakupan yang sama.

Konvensi sintaks transact-SQL

Sintaks

SCOPE_IDENTITY()  

Jenis Kembalian

numerik(38,0)

Keterangan

SCOPE_IDENTITY, IDENT_CURRENT, dan @@IDENTITY adalah fungsi serupa karena mengembalikan nilai yang dimasukkan ke dalam kolom identitas.

IDENT_CURRENT tidak dibatasi oleh cakupan dan sesi; ini terbatas pada tabel tertentu. IDENT_CURRENT mengembalikan nilai yang dihasilkan untuk tabel tertentu dalam sesi apa pun dan cakupan apa pun. Untuk informasi selengkapnya, lihat IDENT_CURRENT (Transact-SQL).

SCOPE_IDENTITY dan @@IDENTITY mengembalikan nilai identitas terakhir yang dihasilkan dalam tabel apa pun dalam sesi saat ini. Namun, SCOPE_IDENTITY mengembalikan nilai yang disisipkan hanya dalam cakupan saat ini; @@IDENTITY tidak terbatas pada cakupan tertentu.

Misalnya, ada dua tabel, T1 dan T2, dan pemicu INSERT ditentukan pada T1. Saat baris disisipkan ke T1, pemicu akan menembak dan menyisipkan baris di T2. Skenario ini mengilustrasikan dua cakupan: sisipan pada T1, dan sisipan pada T2 oleh pemicu.

Dengan asumsi bahwa T1 dan T2 memiliki kolom identitas, @@IDENTITY dan SCOPE_IDENTITY mengembalikan nilai yang berbeda di akhir pernyataan INSERT pada T1. @@IDENTITY mengembalikan nilai kolom identitas terakhir yang disisipkan di semua cakupan dalam sesi saat ini. Ini adalah nilai yang disisipkan dalam T2. SCOPE_IDENTITY() mengembalikan nilai IDENTITY yang disisipkan dalam T1. Ini adalah sisipan terakhir yang terjadi dalam cakupan yang sama. Fungsi SCOPE_IDENTITY() mengembalikan nilai null jika fungsi dipanggil sebelum pernyataan INSERT ke dalam kolom identitas terjadi dalam cakupan.

Pernyataan dan transaksi yang gagal dapat mengubah identitas saat ini untuk tabel dan membuat celah dalam nilai kolom identitas. Nilai identitas tidak pernah digulung balik meskipun transaksi yang mencoba memasukkan nilai ke dalam tabel tidak dilakukan. Misalnya, jika pernyataan INSERT gagal karena pelanggaran IGNORE_DUP_KEY, nilai identitas saat ini untuk tabel masih dinaikkan.

Contoh

J. Menggunakan @@IDENTITY dan SCOPE_IDENTITY dengan pemicu

Contoh berikut membuat dua tabel, TZ dan TY, dan pemicu INSERT pada TZ. Saat baris disisipkan ke tabel TZ, pemicu (Ztrig) menembak dan menyisipkan baris di TY.

USE tempdb;  
GO  
CREATE TABLE TZ (  
   Z_id  INT IDENTITY(1,1)PRIMARY KEY,  
   Z_name VARCHAR(20) NOT NULL);  
  
INSERT TZ  
   VALUES ('Lisa'),('Mike'),('Carla');  
  
SELECT * FROM TZ;  

Kumpulan hasil: Ini adalah tampilan tabel TZ.

Z_id   Z_name  
-------------  
1      Lisa  
2      Mike  
3      Carla  
CREATE TABLE TY (  
   Y_id  INT IDENTITY(100,5)PRIMARY KEY,  
   Y_name VARCHAR(20) NULL);  
  
INSERT TY (Y_name)  
   VALUES ('boathouse'), ('rocks'), ('elevator');  
  
SELECT * FROM TY;  

Tataan hasil: Ini adalah tampilan TY:

Y_id  Y_name  
---------------  
100   boathouse  
105   rocks  
110   elevator  

Buat pemicu yang menyisipkan baris dalam tabel TY saat baris disisipkan dalam tabel TZ.

CREATE TRIGGER Ztrig  
ON TZ  
FOR INSERT AS   
   BEGIN  
   INSERT TY VALUES ('')  
   END;  

AKTIFKAN pemicu dan tentukan nilai identitas apa yang Anda peroleh dengan fungsi @@IDENTITY dan SCOPE_IDENTITY.

INSERT TZ VALUES ('Rosalie');  
  
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];  
GO  
SELECT @@IDENTITY AS [@@IDENTITY];  
GO  

Berikut set hasilnya.

/*SCOPE_IDENTITY returns the last identity value in the same scope. This was the insert on table TZ.*/`  
SCOPE_IDENTITY  
4  

/*@@IDENTITY returns the last identity value inserted to TY by the trigger. 
  This fired because of an earlier insert on TZ.*/
@@IDENTITY  
115  

B. Menggunakan @@IDENTITY dan SCOPE_IDENTITY() dengan replikasi

Contoh berikut menunjukkan cara menggunakan @@IDENTITY dan SCOPE_IDENTITY() untuk sisipan dalam database yang diterbitkan untuk replikasi penggabungan. Kedua tabel dalam contoh berada dalam AdventureWorks2022 database sampel: Person.ContactType tidak diterbitkan, dan Sales.Customer diterbitkan. Replikasi penggabungan menambahkan pemicu ke tabel yang diterbitkan. Oleh karena itu, @@IDENTITY dapat mengembalikan nilai dari sisipan ke dalam tabel sistem replikasi alih-alih menyisipkan ke dalam tabel pengguna.

Tabel Person.ContactType memiliki nilai identitas maksimum 20. Jika Anda menyisipkan baris ke dalam tabel, @@IDENTITY dan SCOPE_IDENTITY() mengembalikan nilai yang sama.

USE AdventureWorks2022;  
GO  
INSERT INTO Person.ContactType ([Name]) VALUES ('Assistant to the Manager');  
GO  
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];  
GO  
SELECT @@IDENTITY AS [@@IDENTITY];  
GO  

Berikut set hasilnya.

SCOPE_IDENTITY  
21  
@@IDENTITY  
21

Tabel Sales.Customer memiliki nilai identitas maksimum 29483. Jika Anda menyisipkan baris ke dalam tabel, @@IDENTITY dan SCOPE_IDENTITY() mengembalikan nilai yang berbeda. SCOPE_IDENTITY() mengembalikan nilai dari sisipan ke dalam tabel pengguna, sedangkan @@IDENTITY mengembalikan nilai dari sisipan ke dalam tabel sistem replikasi. Gunakan SCOPE_IDENTITY() untuk aplikasi yang memerlukan akses ke nilai identitas yang disisipkan.

INSERT INTO Sales.Customer ([TerritoryID],[PersonID]) VALUES (8,NULL);  
GO  
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];  
GO  
SELECT @@IDENTITY AS [@@IDENTITY];  
GO  

Berikut set hasilnya.

SCOPE_IDENTITY  
29484  
@@IDENTITY  
89

Lihat Juga

@@IDENTITY (T-SQL)