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.
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