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

One thought on “@@IDENTITY vs. SCOPE_IDENTITY()

  1. Pingback: Dotazy do MSSQL | JoeBK.com

Napsat komentář

Vyplňte detaily níže nebo klikněte na ikonu pro přihlášení:

WordPress.com Logo

Komentujete pomocí vašeho WordPress.com účtu. Log Out / Změnit )

Twitter picture

Komentujete pomocí vašeho Twitter účtu. Log Out / Změnit )

Facebook photo

Komentujete pomocí vašeho Facebook účtu. Log Out / Změnit )

Google+ photo

Komentujete pomocí vašeho Google+ účtu. Log Out / Změnit )

Připojování k %s