SCOPE_IDENTITY (Transact-SQL)SCOPE_IDENTITY (Transact-SQL)

DIESES THEMA GILT FÜR:jaSQL Server (ab 2008)jaAzure SQL-DatenbankneinAzure SQL Data Warehouse neinParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Gibt den letzten Identitätswert zurück, der in eine Identitätsspalte im selben Gültigkeitsbereich eingefügt wurde.Returns the last identity value inserted into an identity column in the same scope. Ein Gültigkeitsbereich ist ein Modul: eine gespeicherte Prozedur, ein Trigger, eine Funktion oder ein Batch.A scope is a module: a stored procedure, trigger, function, or batch. Wenn zwei Anweisungen in der gleichen gespeicherten Prozedur, Funktion oder -Batches befinden, sind sie daher im selben Bereich.Therefore, if two statements are in the same stored procedure, function, or batch, they are in the same scope.

Themenlinksymbol Transact-SQL Syntax Conventions (Transact-SQL-Syntaxkonventionen)Topic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

SCOPE_IDENTITY()  

RückgabetypenReturn Types

numeric(38,0)numeric(38,0)

HinweiseRemarks

SCOPE_IDENTITY, IDENT_CURRENT, und @@IDENTITY ähnliche Funktionen sind, da sie keine Werte zurückgeben, die in Identitätsspalten eingefügt werden.SCOPE_IDENTITY, IDENT_CURRENT, and @@IDENTITY are similar functions because they return values that are inserted into identity columns.

IDENT_CURRENT ist nicht durch einen Gültigkeitsbereich oder eine Sitzung begrenzt, sondern auf eine angegebene Tabelle.IDENT_CURRENT is not limited by scope and session; it is limited to a specified table. IDENT_CURRENT gibt den für eine bestimmte Tabelle in einer beliebigen Sitzung und einem beliebigen Gültigkeitsbereich generierten Wert zurück.IDENT_CURRENT returns the value generated for a specific table in any session and any scope. Weitere Informationen finden Sie unter IDENT_CURRENT ( Transact-SQL ) .For more information, see IDENT_CURRENT (Transact-SQL).

SCOPE_IDENTITY und @@IDENTITY Zurückgeben der letzten Identity-Werte, die in einer beliebigen Tabelle in der aktuellen Sitzung generiert werden.SCOPE_IDENTITY and @@IDENTITY return the last identity values that are generated in any table in the current session. SCOPE_IDENTITY gibt jedoch nur innerhalb des aktuellen Gültigkeitsbereichs eingefügten Werte. @@IDENTITY ist nicht auf einen bestimmten Gültigkeitsbereich begrenzt.However, SCOPE_IDENTITY returns values inserted only within the current scope; @@IDENTITY is not limited to a specific scope.

Beispiel: Es gibt zwei Tabellen, T1 und T2, und für T1 wurde ein INSERT-Trigger definiert.For example, there are two tables, T1 and T2, and an INSERT trigger is defined on T1. Wenn eine Zeile in T1 eingefügt wird, wird der Trigger ausgelöst und fügt eine Zeile in T2 ein.When a row is inserted to T1, the trigger fires and inserts a row in T2. Dieses Szenario veranschaulicht zwei Gültigkeitsbereiche: die Einfügung für T1 und die Einfügung für T2 durch den Trigger.This scenario illustrates two scopes: the insert on T1, and the insert on T2 by the trigger.

Vorausgesetzt, dass T1 und T2 Identitätsspalten aufweisen,@IDENTITY und SCOPE_IDENTITY verschiedene Werte am Ende einer INSERT-Anweisung für T1 zurückgeben.Assuming that both T1 and T2 have identity columns, @@IDENTITY and SCOPE_IDENTITY return different values at the end of an INSERT statement on T1. @@IDENTITY gibt den letzten identitätsspaltenwert in einem beliebigen Gültigkeitsbereich in der aktuellen Sitzung eingefügt.@@IDENTITY returns the last identity column value inserted across any scope in the current session. Das ist der Wert, der in T2 eingefügt wurde.This is the value inserted in T2. SCOPE_IDENTITY() gibt den IDENTITY-Wert, der in T1 eingefügt.SCOPE_IDENTITY() returns the IDENTITY value inserted in T1. Dies war die letzte Einfügung, die im selben Gültigkeitsbereich durchgeführt wurde.This was the last insert that occurred in the same scope. Die SCOPE_IDENTITY()-Funktion gibt den null-Wert zurück, wenn die Funktion aufgerufen wird, bevor INSERT-Anweisungen für eine Identitätsspalte im Gültigkeitsbereich auftreten.The SCOPE_IDENTITY() function returns the null value if the function is invoked before any INSERT statements into an identity column occur in the scope.

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.Failed statements and transactions can change the current identity for a table and create gaps in the identity column values. Für den Identitätswert erfolgt kein Rollback, auch wenn für die Transaktion, die versuchte, den Wert in die Tabelle einzufügen, kein Commit ausgeführt wird.The identity value is never rolled back even though the transaction that tried to insert the value into the table is not committed. Wenn beispielsweise eine INSERT-Anweisung aufgrund einer IGNORE_DUP_KEY-Verletzung fehlschlägt, wird der aktuelle Identitätswert für die Tabelle trotzdem inkrementiert.For example, if an INSERT statement fails because of an IGNORE_DUP_KEY violation, the current identity value for the table is still incremented.

BeispieleExamples

A.A. Mit@IDENTITY und SCOPE_IDENTITY mit TriggernUsing @@IDENTITY and SCOPE_IDENTITY with triggers

Im folgenden Beispiel werden zwei Tabellen, TZ und TY, sowie ein INSERT-Trigger für TZ erstellt.The following example creates two tables, TZ and TY, and an INSERT trigger on TZ. Wenn eine Zeile in die Tabelle TZ eingefügt wird, wird der Trigger (Ztrig) ausgelöst und fügt eine Zeile in TY ein.When a row is inserted to table TZ, the trigger (Ztrig) fires and inserts a row in 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;  

Resultset: Dies ist eine Tabelle TZ wie sieht.Result set: This is how table TZ looks.

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;  

Resultset: Dies ist die Darstellung von "ty":Result set: This is how TY looks:

Y_id  Y_name  
---------------  
100   boathouse  
105   rocks  
110   elevator  

Erstellen Sie den Trigger, der eine Zeile in Tabelle "ty" einfügt, wenn eine Zeile in Tabelle TZ eingefügt wird.Create the trigger that inserts a row in table TY when a row is inserted in table TZ.

CREATE TRIGGER Ztrig  
ON TZ  
FOR INSERT AS   
   BEGIN  
   INSERT TY VALUES ('')  
   END;  

Der Trigger ausgelöst, und ermitteln Sie welche Identity-Werte, die Sie abrufen, mit dem @@IDENTITY und SCOPE_IDENTITY-Funktionen.FIRE the trigger and determine what identity values you obtain with the @@IDENTITY and SCOPE_IDENTITY functions.

INSERT TZ VALUES ('Rosalie');  

SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];  
GO  
SELECT @@IDENTITY AS [@@IDENTITY];  
GO  

Im Folgenden finden Sie das Resultset.Here is the result set.

/*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.B. Mit@IDENTITY und SCOPE_IDENTITY() mit ReplikationUsing @@IDENTITY and SCOPE_IDENTITY() with replication

In den folgenden Beispielen wird veranschaulicht, wie @@IDENTITY und SCOPE_IDENTITY() für Einfügungen in einer Datenbank verwendet werden, die für die Mergereplikation veröffentlicht wird.The following examples show how to use @@IDENTITY and SCOPE_IDENTITY() for inserts in a database that is published for merge replication. Beide Tabellen in den Beispielen befinden sich in der AdventureWorks2012AdventureWorks2012-Beispieldatenbank: Person.ContactType wird nicht veröffentlicht, und Sales.Customer wird veröffentlicht.Both tables in the examples are in the AdventureWorks2012AdventureWorks2012 sample database: Person.ContactType is not published, and Sales.Customer is published. Mit der Mergereplikation werden Tabellen, die veröffentlicht werden, Trigger hinzugefügt.Merge replication adds triggers to tables that are published. Aus diesem Grund kann @@IDENTITY den Wert aus dem Einfügevorgang in eine Replikationssystemtabelle zurückgeben statt aus dem Einfügevorgang in eine Benutzertabelle.Therefore, @@IDENTITY can return the value from the insert into a replication system table instead of the insert into a user table.

Die Person.ContactType Tabelle besitzt den maximalen Identitätswert von 20.The Person.ContactType table has a maximum identity value of 20. Wenn Sie eine Zeile in die Tabelle einfügen, wird von @@IDENTITY und SCOPE_IDENTITY() derselbe Wert zurückgegeben.If you insert a row into the table, @@IDENTITY and SCOPE_IDENTITY() return the same value.

USE AdventureWorks2012;  
GO  
INSERT INTO Person.ContactType ([Name]) VALUES ('Assistant to the Manager');  
GO  
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];  
GO  
SELECT @@IDENTITY AS [@@IDENTITY];  
GO  

Im Folgenden finden Sie das Resultset.Here is the result set.

SCOPE_IDENTITY  
21  
@@IDENTITY  
21

Die Sales.Customer-Tabelle besitzt den maximalen Identitätswert 29483.The Sales.Customer table has a maximum identity value of 29483. Wenn Sie eine Zeile in die Tabelle einfügen, werden von @@IDENTITY und SCOPE_IDENTITY() jeweils unterschiedliche Werte zurückgegeben.If you insert a row into the table, @@IDENTITY and SCOPE_IDENTITY() return different values. SCOPE_IDENTITY() gibt den Wert aus dem Einfügevorgang in die Benutzertabelle zurück, @@IDENTITY hingegen gibt den Wert aus dem Einfügevorgang in die Replikationssystemtabelle zurück.SCOPE_IDENTITY() returns the value from the insert into the user table, whereas @@IDENTITY returns the value from the insert into the replication system table. Verwenden Sie SCOPE_IDENTITY() für Anwendungen, für die der Zugriff auf den eingefügten Identitätswert erforderlich ist.Use SCOPE_IDENTITY() for applications that require access to the inserted identity value.

INSERT INTO Sales.Customer ([TerritoryID],[PersonID]) VALUES (8,NULL);  
GO  
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];  
GO  
SELECT @@IDENTITY AS [@@IDENTITY];  
GO  

Im Folgenden finden Sie das Resultset.Here is the result set.

SCOPE_IDENTITY  
29484  
@@IDENTITY  
89

Siehe auchSee Also

@@IDENTITY (Transact-SQL)@@IDENTITY (Transact-SQL)