Tag Archives: Trigger

@@IDENTITY vs. SCOPE_IDENTITY()

Velmi často se setkávám se zaměňováním „funkcí“ @@IDENTITY a SCOPE_IDENTITY(). Obě dvě dvě představují hodnotu identity-sloupce posledního INSERTu, nicméně každý trochu jinak definovanou a v určitých případech se mohou jejich výsledky lišit.

Definice

@@IDENTITY představuje poslední vloženou identity hodnotu v kontextu celé session, veškeré její aktivity.

SCOPE_IDENTITY() představuje poslední vloženou identity hodnotu v kontextu aktuálního scope, v nejužším slova smyslu.

Příklad

Mějme tabulku Table1 s identity-column a k ní insert trigger, který vkládá hodnotu do druhé tabulky Table2 opět s identity-column. A tady je rozdíl, pokud zavoláme dávku

INSERT INTO Table1 DEFAULT VALUES

SELECT @@IDENTITY         -- vrátí identity hodnotu Table2 z triggeru
SELECT SCOPE_IDENTITY()   -- vrátí identity hodnotu Table1

…s použitím @@IDENTITY si můžeme pěkně naběhnout.

IDENT_CURRENT(‚table‘)

Funkce IDENT_CURRENT(‚tablename‘) vrací poslední hodnotu identity-column tabulky, nezávisle na session či scope.