Aracılığıyla paylaş


@@IDENTITY (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft 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, @@IDENTITY döner NULL.
  • Birden fazla satır eklendiğinde ve birden fazla kimlik değeri üretilirse, @@IDENTITY oluş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ı @@IDENTITY tetikleyiciler 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, @@IDENTITY ilk eklemenin kimlik değerini döndürür. @@IDENTITY veya SELECT INTO deyimi veya toplu kopyalama başarısız olursa INSERT veya 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.

  • @@IDENTITY ve SCOPE_IDENTITY mevcut oturumdaki herhangi bir tabloda oluşturulan son kimlik değerini döndürür. Ancak, SCOPE_IDENTITY değeri yalnızca geçerli kapsam içinde döndürür; @@IDENTITY belirli bir kapsamla sınırlı değildir.

  • IDENT_CURRENT kapsam ve oturumla sınırlı değildir; belirtilen bir tabloyla sınırlıdır. IDENT_CURRENT herhangi 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.