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

Published 30. listopadu 2006 11:49 by MilanBaran
Filed under:

Comments

No Comments