@@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.