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.@@IDENTITY
vrá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.