To se tak člověk někdy vychytá, když narazí na proceduru, kterou udělal někdo před ním ...
A to je ideální stav si vysvětlit rozdíl mezi @@IDENTITY a SCOPE_IDENTITY.
Obě tyto funkce vracejí ID posledního záznamu, který procedurou vytvoříme. Např. v proceduře použijeme příkaz, kterým vkládáme do určité tabulky data a následně potřebujeme zjistit ID posledního námi vloženého záznamu, abychom s ním mohli dále pracovat. ID posledního záznamu můžeme samozřejmě zjistit tím, že nad danou tabulkou zavoláme SELECT MAX (ID) FROM ..... nebo SELECT IDENT_CURRENT( 'Tabulka' ) Pozor, to nám ale vrátí poslední ID v tabulce, takže pokud někdo chvilku po nás udělá také INSERT do dané tabulky, budeme mít ID posledního záznamu a ne toho našeho vloženého, tedy není omezeno relací nebo scope.
Použijeme tedy jednu z výše uvedených funkcí, ale pozor na jejich fungování.
SCOPE_IDENTITY vrací ID posledního záznamu v dané transakci a daném scope, takže pouze z tabulky, do které děláme procedurou INSERT
Kdežto @@IDENTITY vrací ID posledního záznamu, kterým procedura ID vyvolá nějaký INSERT. Takže když je nad tabulkou TRIGGER, který udělá na základě vašeho Insertu také Insert (třeba i do jiné tabulky), tak dostanete ID toho záznamu vytvořeného triggem !!
Můžete si říci: dobře, já triggery používat nebudu. To si taky asi řekl ten, kdo udělal proceduru nad tabulkama, kde jsem já dodatečně vytvořil trigger :-) a pak jsem hledal, proč se mě přestaly správně dělat vazby nad záznamy, kde byl použit právě @@IDENTITY
Doporučením je tedy používat SCOPE_IDENTITY