Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server
Azure SQL-Datenbank
Verwaltete Azure SQL-Instanz
SQL-Datenbank in Microsoft Fabric
@@IDENTITY ist eine Systemfunktion, die den zuletzt eingefügten Identitätswert zurückgibt.
Transact-SQL-Syntaxkonventionen
Syntax
@@IDENTITY
Rückgabetypen
numeric(38,0)
Hinweise
Nach Abschluss einer INSERT, SELECT INTOoder einer Massenkopie-Anweisung enthält sie den letzten Identitätswert, @@IDENTITY den die Anweisung generiert hat.
- Wenn die Anweisung keine Tabellen mit Identitätsspalten beeinflusste,
@@IDENTITYgibtNULL. - Werden mehrere Zeilen eingefügt, wodurch mehrere Identitätswerte erzeugt werden,
@@IDENTITYwird der zuletzt erzeugte Identitätswert zurückgegeben. - Wenn die Anweisung einen oder mehrere Trigger auslöst, die Einfügungen ausführen, die Identitätswerte generieren, wird
@@IDENTITYunmittelbar nach der Anweisung der letzte von den Triggern generierte Identitätswert zurückgegeben. - Wenn ein Auslöser nach einer Einfügeaktion in einer Tabelle ausgelöst wird, die eine Identitätsspalte enthält und der Auslöser in eine andere Tabelle eingefügt wird, die keine Identitätsspalte aufweist,
@@IDENTITYgibt den Identitätswert des ersten Einfügens zurück. Der@@IDENTITYWert wird nicht auf eine vorherige Einstellung zurückgesetzt, wenn dieINSERTAnweisung oderSELECT INTOMassenkopie fehlschlägt oder wenn die Transaktion zurückgesetzt wird.
Fehlgeschlagene Anweisungen oder Transaktionen können die aktuelle Identität für eine Tabelle ändern und zu Lücken in den Identitätsspaltenwerten führen. Der Identitätswert wird nie zurückgesetzt, obwohl die Transaktion, die versucht hat, den Wert in die Tabelle einzufügen, nicht zugesichert ist. Wenn beispielsweise eine INSERT Anweisung aufgrund eines IGNORE_DUP_KEY Verstoßes fehlschlägt, wird der aktuelle Identitätswert für die Tabelle noch erhöht.
@@IDENTITY, SCOPE_IDENTITY, und IDENT_CURRENT sind ähnliche Funktionen, da sie alle den zuletzt eingefügten Wert in die IDENTITY Spalte einer Tabelle zurückgeben.
@@IDENTITYundSCOPE_IDENTITYden zuletzt in einer Tabelle in der aktuellen Sitzung generierten Identitätswert zurückzugeben.SCOPE_IDENTITYGibt den Wert jedoch nur innerhalb des aktuellen Bereichs zurück;@@IDENTITYist nicht auf einen bestimmten Bereich beschränkt.IDENT_CURRENTist nicht durch Umfang und Sitzung beschränkt; sie ist auf eine angegebene Tabelle beschränkt.IDENT_CURRENTgibt den Identitätswert zurück, der für eine bestimmte Tabelle in jeder Sitzung und jedem Scope erzeugt wurde. Weitere Informationen finden Sie unter IDENT_CURRENT (Transact-SQL).
Der Bereich der @@IDENTITY Funktion ist die aktuelle Sitzung auf dem lokalen Server, auf dem sie ausgeführt wird. Diese Funktion kann nicht auf Remote- oder verknüpfte Server angewendet werden. Um einen Identitätswert auf einem anderen Server abzurufen, führen Sie eine gespeicherte Prozedur auf diesem Remote- oder verknüpften Server aus und weisen diese gespeicherte Prozedur (die im Kontext des Remote- oder verknüpften Servers ausgeführt wird) den Identitätswert auf und geben sie an die aufrufende Verbindung auf dem lokalen Server zurück.
Die Replikation kann sich auf den @@IDENTITY Wert auswirken, da sie innerhalb der Replikationstrigger und gespeicherten Prozeduren verwendet wird.
@@IDENTITY ist kein zuverlässiger Indikator für die zuletzt vom Benutzer erstellte Identität, wenn die Spalte Teil eines Replikationsartikels ist. Du kannst die SCOPE_IDENTITY() Funktionssyntax anstelle von @@IDENTITYverwenden. Weitere Informationen finden Sie unter SCOPE_IDENTITY (Transact-SQL).
Hinweis
Die aufrufende gespeicherte Prozedur oder die Transact-SQL-Anweisung muss so umgeschrieben werden, dass sie die SCOPE_IDENTITY()-Funktion verwendet, die die neueste im Bereich dieser Benutzeranweisung verwendete Identität und nicht die Identität im Bereich des geschachtelten Triggers zurückgibt, der von der Replikation verwendet wird.
Beispiele
A. Abrufen des Letzten eingefügten Identitätswerts
Das folgende Beispiel fügt eine Zeile in eine Tabelle mit einer Identitätsspalte (LocationID) ein und zeigt mithilfe von @@IDENTITY den in der neuen Zeile verwendeten Identitätswert an.
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. Einfügen von übergeordneten und untergeordneten Zeilen mithilfe von @@IDENTITY
Im folgenden Beispiel wird die Verwendung @@IDENTITY zum Erfassen des Identitätswerts einer übergeordneten Zeile veranschaulicht und verwendet, wenn Sie verwandte untergeordnete Zeilen einfügen. Dieses Muster ist in Tabellendesigns mit übergeordneter und untergeordneter Reihenfolge üblich.
-- 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
Hinweis
Verwenden Sie SCOPE_IDENTITY() im Produktionscode anstelle dieses Musters @@IDENTITY . Wenn ein Trigger in der Orders Tabelle ausgelöst wird und ein Einfügen in eine andere Tabelle mit einer Identitätsspalte durchführt, @@IDENTITY wird der Identitätswert des Triggers anstelle des Orders Identitätswerts zurückgegeben.
SCOPE_IDENTITY() gibt nur den Identitätswert aus dem aktuellen Bereich zurück.
C. Verstehen des Unterschieds zwischen @@IDENTITY und SCOPE_IDENTITY
Das folgende Beispiel zeigt, wie @@IDENTITY verschiedene SCOPE_IDENTITY() Werte zurückgegeben werden können, wenn Trigger beteiligt sind.
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
In diesem Beispiel SCOPE_IDENTITY() wird die ProductID Tabelle Products (aktueller Bereich) zurückgegeben, während @@IDENTITY sie aus AuditID der ProductAudit Tabelle (Triggerbereich) zurückgegeben wird. Für die meisten Anwendungsszenarien ist die sicherere Wahl, SCOPE_IDENTITY() da sie nicht von Triggeraktivitäten betroffen ist.