V SQL Server můžete použít T-SQL @@IDENTITY
systémovou funkci, která vrátí naposledy vloženou hodnotu identity v aktuální relaci.
Všimněte si, že vrací poslední hodnotu identity vygenerovanou v any tabulky v aktuální relaci . To je v kontrastu s IDENT_CURRENT()
funkce, která vrací naposledy vloženou hodnotu identity pro danou tabulku .
SCOPE_IDENTITY()
funkce je velmi podobná funkci @@IDENTITY
v tom, že také vrátí naposledy vloženou hodnotu identity v aktuální relaci. Rozdíl je v tom, že SCOPE_IDENTITY()
je omezena na aktuální rozsah.
Příklad 1
Zde je základní příklad kódu @@IDENTITY
použití.
VYBERTE @@IDENTITY JAKO [naposledy vložená hodnota identity];
Výsledek:
+--------------------------------+| Naposledy vložená hodnota identity ||--------------------------------|| NULL |+--------------------------------+
Důvod, proč to vrací NULL
je to proto, že jsem otevřel novou relaci na SQL Server a během aktuální relace jsem ještě neaktualizoval sloupec identity.
Níže je uveden kód, který provádí některé aktualizace sloupců identity.
CREATE TABLE Cats(id int IDENTITY);CREATE TABLE Psi(id int IDENTITY);INSERT Cats DEFAULT VALUES;INSERT Cats DEFAULT VALUES;SELECT @@IDENTITY AS [Last-Inserted Identity Value];
Výsledek:
+--------------------------------+| Naposledy vložená hodnota identity ||--------------------------------|| 2 |+--------------------------------+
Zde vytvořím několik tabulek, vložím nějaká data a poté vyberu aktuální hodnotu identity.
Aktuální hodnota identity je 2, protože jsem do této tabulky vložil dva řádky.
Nyní vložíme jeden řádek do druhé tabulky:
INSERT Dogs DEFAULT VALUES;SELECT @@IDENTITY AS [Last-Inserted Identity Value];
Výsledek:
+--------------------------------+| Naposledy vložená hodnota identity ||--------------------------------|| 1 |+--------------------------------+
Vrácená hodnota je 1, protože to je poslední vložená hodnota identity pro tuto relaci.
Příklad 2 – ve srovnání s IDENT_CURRENT()
Zde je to porovnáno s IDENT_CURRENT()
.
VYBERTE @@IDENTITY JAKO [@@IDENTITY], IDENT_CURRENT('Kočky') JAKO [IDENT_CURRENT('Kočky')], IDENT_CURRENT('Psi') JAKO [IDENT_CURRENT('Psi')];
Výsledek:
+--------------+-------------------------+----- ---------------------+| @@IDENTITY | IDENT_CURRENT('Kočky') | IDENT_CURRENT('Psi') ||--------------+-------------------------+- -------------------------|| 1 | 2 | 1 |+--------------+-------------------------+------ -------------------+
Jak již bylo zmíněno, IDENT_CURRENT()
vrátí výsledek na základě zadané tabulky. Můžeme jej tedy použít k nalezení posledních hodnot identity pro každou tabulku.
Příklad 3 – Přepnutí na novou relaci
Nyní, když otevřu nové připojení a vyberu @@IDENTITY
znovu se stane toto:
POUŽÍVEJTE test; VYBERTE @@IDENTITY JAKO [@@IDENTITY], IDENT_CURRENT('Kočky') JAKO [IDENT_CURRENT('Kočky')], IDENT_CURRENT('Psi') JAKO [IDENT_CURRENT('Psi')];Výsledek:
+--------------+-------------------------+----- ---------------------+| @@IDENTITY | IDENT_CURRENT('Kočky') | IDENT_CURRENT('Psi') ||--------------+-------------------------+- -------------------------|| NULL | 2 | 1 |+--------------+-------------------------+------ -------------------+
@@IDENTITY
výsledek je NULL, protože jsem do sloupce identity v nové relaci nic nevložil.
IDENT_CURRENT()
výsledky nejsou NULL, protože jejich výsledek je založen na tabulce – nikoli na relaci.@@IDENTITY vs. SCOPE_IDENTITY() vs IDENT_CURRENT()
Viz IDENT_CURRENT vs @@IDENTITY vs SCOPE_IDENTITY v SQL Server:Jaký je rozdíl? pro jednoduchý příklad, který projde rozdíly mezi těmito třemi funkcemi.