Sdílet prostřednictvím


SCOPE_IDENTITY (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL databáze v Microsoft Fabric

Vrátí poslední hodnotu identity vloženou do sloupce identity ve stejném rozsahu. Dalekohled je modul: uložený postup, spouštěč, funkce nebo dávka. Pokud jsou tedy dva výroky ve stejné uložené procedurě, funkci nebo dávce, jsou ve stejném rozsahu.

Transact-SQL konvence syntaxe

Syntaxe

SCOPE_IDENTITY()  

Návratové typy

numerické(38,0)

Poznámky

SCOPE_IDENTITY, IDENT_CURRENT a @@IDENTITY jsou podobné funkce, protože vracejí hodnoty vložené do identitních sloupců.

IDENT_CURRENT není omezena rozsahem a zasedáním; je omezen na specifickou tabulku. IDENT_CURRENT vrací hodnotu generovanou pro konkrétní tabulku v jakékoli relaci a v jakémkoli rozsahu. Pro více informací viz IDENT_CURRENT (Transact-SQL).

SCOPE_IDENTITY a @@IDENTITY vracejí poslední hodnoty identity, které jsou generovány v libovolné tabulce v aktuální relaci. Nicméně SCOPE_IDENTITY vrací hodnoty vložené pouze v aktuálním rozsahu; @@IDENTITY není omezena na konkrétní rozsah.

Například existují dvě tabulky, T1 a T2, a na T1 je definován spouštěč INSERT. Když je řada vložena do T1, spoušť vystřelí a vloží řadu do T2. Tento scénář ilustruje dva puškohledy: vložku na T1 a vložku na T2 u spouště.

Za předpokladu, že jak T1, tak T2 mají identifikační sloupce, @@IDENTITY a SCOPE_IDENTITY na konci příkazu INSERT na T1 vracejí různé hodnoty. @@IDENTITY vrátí poslední hodnotu sloupce identity vloženou přes libovolný rozsah aktuální relace. Toto je hodnota vložená do T2. SCOPE_IDENTITY() vrací hodnotu IDENTITY vloženou do T1. Toto byla poslední vložka, která se objevila ve stejném puškohledu. Funkce SCOPE_IDENTITY() vrací nullovou hodnotu, pokud je funkce vyvolána dříve, než se v rozsahu objeví příkazy INSERT v sloupci identity.

Neúspěšné příkazy a transakce mohou změnit aktuální identitu tabulky a vytvořit mezery v hodnotách sloupců identity. Hodnota identity se nikdy nevrátí zpět, i když transakce, která se pokusila hodnotu vložit do tabulky, není potvrzena. Například pokud příkaz INSERT selže kvůli porušení IGNORE_DUP_KEY, aktuální hodnota identity tabulky je stále zvýšena.

Examples

A. Používám @@IDENTITY a SCOPE_IDENTITY s triggery

Následující příklad vytváří dvě tabulky, TZ a TY, a spouštěč INSERT na TZ. Když je řádek vložen do tabulkyTZ, spoušť (Ztrig) spustí a vloží řádek do .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;  

Výsledná sada: Takto vypadá tabulka TZ.

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;  

Výsledná sada: Takto vypadá TY:

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

Vytvořte spouštěč, který vloží řádek do tabulky TY, když je řádek vložen do tabulky TZ.

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

FIRE trigger a urč, jaké hodnoty identity získáš pomocí funkcí @@IDENTITY a SCOPE_IDENTITY.

INSERT TZ VALUES ('Rosalie');  
  
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];  
GO  
SELECT @@IDENTITY AS [@@IDENTITY];  
GO  

Tady je soubor výsledků.

/*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. Použití @@IDENTITY a SCOPE_IDENTITY() s replikací

Následující příklady ukazují, jak použít a @@IDENTITY pro SCOPE_IDENTITY() inserts v databázi, která je publikována pro replikaci merge. Obě tabulky v příkladech jsou v ukázkové databázi AdventureWorks2025 : Person.ContactType není publikována a je Sales.Customer publikována. Replikace sloučení přidává spouštěče do tabulek, které jsou publikovány. Proto @@IDENTITY lze vrátit hodnotu z insertu do replikační systémové tabulky místo insertu do uživatelské tabulky.

Tabulka Person.ContactType má maximální hodnotu identity 20. Pokud vložíte řádek do tabulky a @@IDENTITY vrátíte stejnou hodnotu. SCOPE_IDENTITY()

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

Tady je soubor výsledků.

SCOPE_IDENTITY  
21  
@@IDENTITY  
21

Tabulka Sales.Customer má maximální hodnotu identity 29483. Pokud vložíte řádek do tabulky a @@IDENTITY vrátíte různé hodnoty. SCOPE_IDENTITY() SCOPE_IDENTITY() vrací hodnotu z vložené do uživatelské tabulky, zatímco @@IDENTITY vrací hodnotu z vložené do tabulky replikačního systému. Použití SCOPE_IDENTITY() pro aplikace, které vyžadují přístup k vložené hodnotě identity.

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

Tady je soubor výsledků.

SCOPE_IDENTITY  
29484  
@@IDENTITY  
89

Viz také

@@IDENTITY (Transact-SQL)