Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL 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.
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