Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Microsoft Fabric'te SQL veritabanı
@@IDENTITY son eklenen kimlik değerini döndüren bir sistem fonksiyonudur.
Transact-SQL söz dizimi kuralları
Sözdizimi
@@IDENTITY
Dönüş türleri
numeric(38,0)
Açıklamalar
bir INSERT, SELECT INTOveya toplu kopyalama deyimi tamamlandıktan sonra, @@IDENTITY deyiminin oluşturduğu son kimlik değerini içerir.
- Eğer ifade kimlik sütunlu tabloları etkilemiyorsa,
@@IDENTITYdönerNULL. - Birden fazla satır eklendiğinde ve birden fazla kimlik değeri üretilirse,
@@IDENTITYoluşturulan son kimlik değeri döner. - Eğer ifade bir veya birden fazla tetikleyiciyi tetiklerse, özdeşlik değerleri üreten eklemeleri gerçekleştirirse, hemen ardından çağrı
@@IDENTITYtetikleyiciler tarafından üretilen son kimlik değerini döndürür. - Bir tetikleyici, kimlik sütunu olan bir tablodaki ekleme eyleminden sonra tetiklendiğinde ve tetikleyici kimlik sütunu olmayan başka bir tabloya eklenirse,
@@IDENTITYilk eklemenin kimlik değerini döndürür.@@IDENTITYveyaSELECT INTOdeyimi veya toplu kopyalama başarısız olursaINSERTveya işlem geri alınırsa değer önceki bir ayara geri dönmez.
Başarısız ifadeler ve işlemler, bir tablonun mevcut kimliğini değiştirebilir ve kimlik sütunu değerlerinde boşluklar yaratabilir. Değeri tabloya eklemeye çalışan işlem işlenmese bile kimlik değeri hiçbir zaman geri alınamaz. Örneğin, bir INSERT deyimi ihlal IGNORE_DUP_KEY nedeniyle başarısız olursa, tablonun geçerli kimlik değeri yine de artırılır.
@@IDENTITY, SCOPE_IDENTITY, ve IDENT_CURRENT benzer fonksiyonlardır çünkü hepsi tablonun sütununa eklenen IDENTITY son değeri döndürür.
@@IDENTITYveSCOPE_IDENTITYmevcut oturumdaki herhangi bir tabloda oluşturulan son kimlik değerini döndürür. Ancak,SCOPE_IDENTITYdeğeri yalnızca geçerli kapsam içinde döndürür;@@IDENTITYbelirli bir kapsamla sınırlı değildir.IDENT_CURRENTkapsam ve oturumla sınırlı değildir; belirtilen bir tabloyla sınırlıdır.IDENT_CURRENTherhangi bir oturumda ve herhangi bir kapsamda belirli bir tablo için oluşturulan kimlik değerini döndürür. Daha fazla bilgi için bkz. IDENT_CURRENT (Transact-SQL).
İşlevin @@IDENTITY kapsamı, üzerinde çalıştığı yerel sunucuda geçerli oturumdur. Bu işlev uzak veya bağlı sunuculara uygulanamaz. Farklı bir sunucuda kimlik değeri almak için, bu uzak veya bağlı sunucuda bir saklı yordam yürütür ve bu saklı yordamın (uzak veya bağlı sunucu bağlamında çalışır) kimlik değerini toplamasını ve yerel sunucudaki çağrı bağlantısına döndürmesini sağlayın.
Çoğaltma tetikleyicileri @@IDENTITY ve saklı yordamlar içinde kullanıldığından, çoğaltma değeri etkileyebilir.
@@IDENTITY sütun bir çoğaltma makalesinin parçasıysa, kullanıcı tarafından oluşturulan en son kimliğin güvenilir bir göstergesi değildir.
SCOPE_IDENTITY() Fonksiyon sözdizimi yerine @@IDENTITYkullanabilirsiniz. Daha fazla bilgi için bkz. SCOPE_IDENTITY (Transact-SQL).
Uyarı
Çağrılan depolanmış prosedür veya Transact-SQL ifadesi, o kullanıcı ifadesi kapsamında kullanılan en son kimliği döndüren fonksiyonu kullanacak şekilde yeniden yazılmalıdır SCOPE_IDENTITY() ; bu da çoğaltma ile kullanılan iç içe tetikleyicinin kapsamındaki kimliği değil.
Örnekler
A. Son eklenen kimlik değerini alma
Aşağıdaki örnek, bir kimlik sütunuylaLocationID () bir satır ekler ve yeni satırda kullanılan kimlik değerini göstermek için kullanılır @@IDENTITY .
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. @@IDENTITY kullanarak üst ve alt satır ekleme
Aşağıdaki örnekte, bir üst satırın kimlik değerini yakalamak ve ilgili alt satırları eklerken kullanmak için komutunun @@IDENTITY kullanılması gösterilmektedir. Bu düzen, sıralı giriş ve üst-alt tablo tasarımlarında yaygındır.
-- 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
Uyarı
Üretim kodunda, bu desen için yerine @@IDENTITY kullanınSCOPE_IDENTITY(). Bir tetikleyici tabloda tetiklendiğinde Orders ve kimlik sütunu olan başka bir tabloya ekleme gerçekleştirirse, @@IDENTITY kimlik değeri yerine tetikleyicinin Orders kimlik değerini döndürür.
SCOPE_IDENTITY() yalnızca geçerli kapsamdaki kimlik değerini döndürür.
C. @@IDENTITY ile SCOPE_IDENTITY arasındaki farkı anlama
Aşağıdaki örnekte tetikleyiciler söz konusu olduğunda farklı değerlerin nasıl @@IDENTITY ve SCOPE_IDENTITY() döndürülebileceği gösterilmektedir.
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
Bu örnekte, tablosundan Products (geçerli kapsam) değerini döndürürken ProductID@@IDENTITY, tablosundan ProductAudit (tetikleyici kapsamı) değerini döndürürAuditID. SCOPE_IDENTITY() Çoğu uygulama senaryosunda, SCOPE_IDENTITY() tetikleyici etkinliğinden etkilenmediğinden daha güvenli bir seçimdir.