V SQL Server, pokud někdy potřebujete vrátit hodnotu vytvořenou ve sloupci identity, máte několik možností. Každá z těchto možností, i když je podobná, dělá trochu jinou věc.
Zejména můžete použít následující funkce:
IDENT_CURRENT()vrátí naposledy vloženou hodnotu identity pro danou tabulku.SCOPE_IDENTITY()vrátí poslední hodnotu identity vloženou do sloupce identity v any tabulky v aktuální relaci a aktuálním rozsahu.@@IDENTITYvrátí naposledy vloženou hodnotu identity v any tabulky v aktuální relaci, bez ohledu na rozsah.
Příklad
Zde je příklad, který ukazuje rozdíl mezi těmito třemi funkcemi.
Nejprve vytvořte dvě tabulky. Všimněte si různých počátečních a přírůstkových hodnot používaných pro sloupec identity v každé tabulce:
CREATE TABLE t1(id int IDENTITY(1,1)); CREATE TABLE t2(id int IDENTITY(150,10));
Nyní vytvořte spouštěč, který vloží řádek do druhé tabulky vždy, když je řádek vložen do první tabulky:
CREATE TRIGGER t1_insert_trigger ON t1 FOR INSERT AS BEGIN INSERT t2 DEFAULT VALUES END;
Spouští palbu v jiném rozsahu, takže to je ideální pro můj příklad zde.
Vložte data do první tabulky a poté vyberte výsledky z obou tabulek:
INSERT t1 DEFAULT VALUES; SELECT id AS t1 FROM t1; SELECT id AS t2 FROM t2;
Výsledek:
+------+ | t1 | |------| | 1 | +------+ (1 row affected) +------+ | t2 | |------| | 150 | +------+ (1 row affected)
Aby bylo jasno, tato data byla vložena dvěma různými rozsahy. Vložit do t1 bylo provedeno podle aktuálního rozsahu. Vložit do t2 bylo provedeno spouštěčem, které běželo v jiném rozsahu.
Nyní si vyberme z výše zmíněných funkcí:
SELECT
@@IDENTITY AS [@@IDENTITY],
SCOPE_IDENTITY() AS [SCOPE_IDENTITY()],
IDENT_CURRENT('t1') AS [IDENT_CURRENT('t1')],
IDENT_CURRENT('t2') AS [IDENT_CURRENT('t2')];
Výsledek:
+--------------+--------------------+-----------------------+-----------------------+
| @@IDENTITY | SCOPE_IDENTITY() | IDENT_CURRENT('t1') | IDENT_CURRENT('t2') |
|--------------+--------------------+-----------------------+-----------------------|
| 150 | 1 | 1 | 150 |
+--------------+--------------------+-----------------------+-----------------------+
Výsledek vrácený @@IDENTITY není omezena na rozsah, a proto vrací naposledy vloženou hodnotu identity bez ohledu na rozsah.
SCOPE_IDENTITY() vrátí hodnotu identity z první tabulky, protože to byla poslední vložená hodnota identity v aktuálním rozsahu (spouštěč je mimo aktuální rozsah).
IDENT_CURRENT() funkce jednoduše vrátí poslední hodnotu identity vloženou do zadané tabulky, bez ohledu na rozsah nebo relaci.
Otevřít novou relaci
Nyní se podívejme, co se stane, když otevřu novou relaci a znovu spustím předchozí příkaz:
USE Test;
SELECT
@@IDENTITY AS [@@IDENTITY],
SCOPE_IDENTITY() AS [SCOPE_IDENTITY()],
IDENT_CURRENT('t1') AS [IDENT_CURRENT('t1')],
IDENT_CURRENT('t2') AS [IDENT_CURRENT('t2')];
Výsledek:
+--------------+--------------------+-----------------------+-----------------------+
| @@IDENTITY | SCOPE_IDENTITY() | IDENT_CURRENT('t1') | IDENT_CURRENT('t2') |
|--------------+--------------------+-----------------------+-----------------------|
| NULL | NULL | 1 | 150 |
+--------------+--------------------+-----------------------+-----------------------+
Oba @@IDENTITY a SCOPE_IDENTITY() jsou NULL, protože vracejí pouze výsledky z aktuální relace. V této nové relaci jsem neprovedl žádné vložení sloupce identity, takže dostávám hodnotu NULL.
IDENT_CURRENT() na druhou stranu vrací stejný výsledek jako v předchozím příkladu, opět proto, že jeho výsledky jsou založeny na zadané tabulce bez ohledu na relaci nebo rozsah.