Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Database SQL di Microsoft Fabric
@@IDENTITY adalah fungsi sistem yang mengembalikan nilai identitas yang terakhir dimasukkan.
Sintaks
@@IDENTITY
Tipe pengembalian
numerik(38,0)
Keterangan
INSERTSetelah pernyataan salinan massal , SELECT INTO, atau selesai, @@IDENTITY berisi nilai identitas terakhir yang dihasilkan oleh pernyataan.
- Jika pernyataan tidak memengaruhi tabel dengan kolom identitas,
@@IDENTITYmengembalikanNULL. - Jika beberapa baris dimasukkan, menghasilkan beberapa nilai identitas,
@@IDENTITYmengembalikan nilai identitas terakhir yang dihasilkan. - Jika pernyataan memicu satu atau beberapa pemicu yang melakukan penyisipan yang menghasilkan nilai identitas, memanggil
@@IDENTITYsegera setelah pernyataan mengembalikan nilai identitas terakhir yang dihasilkan oleh pemicu. - Jika pemicu diaktifkan setelah tindakan sisipkan pada tabel yang memiliki kolom identitas, dan pemicu menyisipkan ke tabel lain yang tidak memiliki kolom identitas,
@@IDENTITYmengembalikan nilai identitas dari sisipan pertama. Nilai@@IDENTITYtidak kembali ke pengaturan sebelumnya jikaINSERTpernyataan atauSELECT INTOatau salinan massal gagal, atau jika transaksi digulung balik.
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 INSERT pernyataan gagal karena IGNORE_DUP_KEY pelanggaran, nilai identitas saat ini untuk tabel masih dinaikkan.
@@IDENTITY, SCOPE_IDENTITY, dan IDENT_CURRENT merupakan fungsi serupa karena semuanya mengembalikan nilai terakhir yang dimasukkan ke dalam IDENTITY kolom tabel.
@@IDENTITYdanSCOPE_IDENTITYmengembalikan nilai identitas terakhir yang dihasilkan dalam tabel apa pun dalam sesi saat ini. Namun,SCOPE_IDENTITYmengembalikan nilai hanya dalam cakupan saat ini;@@IDENTITYtidak terbatas pada cakupan tertentu.IDENT_CURRENTtidak dibatasi oleh cakupan dan sesi; ini terbatas pada tabel tertentu.IDENT_CURRENTmengembalikan nilai identitas yang dihasilkan untuk tabel tertentu dalam sesi apa pun dan cakupan apa pun. Untuk informasi selengkapnya, lihat IDENT_CURRENT (Transact-SQL).
Cakupan @@IDENTITY fungsi adalah sesi saat ini di server lokal tempat fungsi berjalan. Fungsi ini tidak dapat diterapkan ke server jarak jauh atau tertaut. Untuk mendapatkan nilai identitas di server yang berbeda, jalankan prosedur tersimpan pada server jarak jauh atau tertaut tersebut dan minta prosedur tersimpan tersebut (yang berjalan dalam konteks server jarak jauh atau tertaut) kumpulkan nilai identitas dan kembalikan ke koneksi panggilan di server lokal.
Replikasi dapat memengaruhi @@IDENTITY nilai, karena digunakan dalam pemicu replikasi dan prosedur tersimpan.
@@IDENTITY bukan indikator yang dapat diandalkan dari identitas yang dibuat pengguna terbaru jika kolom adalah bagian dari artikel replikasi. Anda dapat menggunakan SCOPE_IDENTITY() sintaks fungsi alih-alih @@IDENTITY. Untuk informasi selengkapnya, lihat SCOPE_IDENTITY (Transact-SQL).
Catatan
Prosedur tersimpan panggilan atau pernyataan Transact-SQL harus ditulis ulang untuk menggunakan SCOPE_IDENTITY() fungsi , yang mengembalikan identitas terbaru yang digunakan dalam cakupan pernyataan pengguna tersebut, dan bukan identitas dalam cakupan pemicu berlapis yang digunakan oleh replikasi.
Contoh
A. Mengambil nilai identitas terakhir yang disisipkan
Contoh berikut menyisipkan baris ke dalam tabel dengan kolom identitas (LocationID) dan menggunakan @@IDENTITY untuk menampilkan nilai identitas yang digunakan di baris baru.
USE AdventureWorks2022;
GO
--Display the value of LocationID in the last row in the table.
SELECT MAX(LocationID) FROM Production.Location;
GO
INSERT INTO Production.Location (Name, CostRate, Availability, ModifiedDate)
VALUES ('Damaged Goods', 5, 2.5, GETDATE());
GO
SELECT @@IDENTITY AS 'Identity';
GO
--Display the value of LocationID of the newly inserted row.
SELECT MAX(LocationID) FROM Production.Location;
GO
B. Sisipkan baris induk dan turunan menggunakan @@IDENTITY
Contoh berikut menunjukkan penggunaan @@IDENTITY untuk mengambil nilai identitas baris induk dan menggunakannya saat Anda menyisipkan baris turunan terkait. Pola ini umum dalam desain tabel entri pesanan dan induk-anak.
-- Create sample tables
CREATE TABLE dbo.Orders (
OrderID int IDENTITY(1, 1) PRIMARY KEY,
CustomerName nvarchar(100) NOT NULL,
OrderDate datetime NOT NULL DEFAULT GETDATE()
);
CREATE TABLE dbo.OrderDetails (
DetailID int IDENTITY(1, 1) PRIMARY KEY,
OrderID int NOT NULL REFERENCES dbo.Orders(OrderID),
ProductName nvarchar(100) NOT NULL,
Quantity int NOT NULL
);
GO
-- Insert a parent row and capture its identity
INSERT INTO dbo.Orders (CustomerName, OrderDate)
VALUES ('Contoso Ltd', GETDATE());
DECLARE @NewOrderID int = @@IDENTITY;
-- Insert child rows using the captured parent identity
INSERT INTO dbo.OrderDetails (OrderID, ProductName, Quantity)
VALUES (@NewOrderID, 'Widget A', 10);
INSERT INTO dbo.OrderDetails (OrderID, ProductName, Quantity)
VALUES (@NewOrderID, 'Widget B', 5);
-- Verify the results
SELECT o.OrderID, o.CustomerName, d.ProductName, d.Quantity
FROM dbo.Orders o
INNER JOIN dbo.OrderDetails d ON o.OrderID = d.OrderID
WHERE o.OrderID = @NewOrderID;
GO
Catatan
Dalam kode produksi, gunakan SCOPE_IDENTITY() alih-alih @@IDENTITY untuk pola ini. Jika pemicu diaktifkan pada Orders tabel dan melakukan penyisipan ke tabel lain dengan kolom identitas, @@IDENTITY mengembalikan nilai identitas pemicu alih-alih Orders nilai identitas.
SCOPE_IDENTITY() hanya mengembalikan nilai identitas dari cakupan saat ini.
C. Memahami perbedaan antara @@IDENTITY dan SCOPE_IDENTITY
Contoh berikut menunjukkan cara @@IDENTITY dan SCOPE_IDENTITY() dapat mengembalikan nilai yang berbeda saat pemicu terlibat.
CREATE TABLE dbo.Products (
ProductID int IDENTITY(1, 1) PRIMARY KEY,
ProductName nvarchar(100) NOT NULL
);
CREATE TABLE dbo.ProductAudit (
AuditID int IDENTITY(1000, 1) PRIMARY KEY,
ProductID int NOT NULL,
AuditAction nvarchar(50) NOT NULL,
AuditDate datetime NOT NULL DEFAULT GETDATE()
);
GO
-- Create a trigger that inserts into ProductAudit
CREATE TRIGGER trg_ProductInsert
ON dbo.Products
AFTER INSERT
AS
BEGIN
INSERT INTO dbo.ProductAudit (ProductID, AuditAction)
SELECT ProductID, 'INSERT'
FROM inserted;
END;
GO
-- Insert a product and compare identity values
INSERT INTO dbo.Products (ProductName) VALUES ('Test Product');
SELECT @@IDENTITY AS [@@IDENTITY],
SCOPE_IDENTITY() AS [SCOPE_IDENTITY];
GO
Dalam contoh ini, SCOPE_IDENTITY() mengembalikan ProductID dari Products tabel (cakupan saat ini), sementara @@IDENTITY mengembalikan AuditID dari ProductAudit tabel (cakupan pemicu). Untuk sebagian besar skenario aplikasi, SCOPE_IDENTITY() adalah pilihan yang lebih aman karena tidak terpengaruh oleh aktivitas pemicu.