Azonosító érték előhívó függvény SQL SERVER 2000-ben Az SQL Server 2000-ben az identitás oszlopot az IDENTITY definiálja, és a következő kapcsolódik az utoljára beillesztett rekord identitásértékének megszerzéséhez
Példa az off funkciójára
SQL Serverben az SCOPE_IDENTITY(), @@IDENTITY, IDENT_CURRENT() billentyűkkel megkaphatod az utolsó beillesztett rekord értékét, és ezek közötti különbség a következő: SCOPE_IDENTITY() adja vissza az utolsó IDENTITY értéket, amelyet ugyanabban a scope-ban az IDENTITY oszlopba helyeztek be. A scope egy modul – tárolt eljárások, triggerek, függvények
Számok vagy adagok. Ezért, ha két állítás ugyanabban a tárolt eljárásban, függvényben vagy kötetben van, ugyanabban a hatókörben vannak. @@IDENTITY Visszaadja az összes táblában generált utolsó azonosító értéket a jelenlegi ülés során IDENT_CURRENT() visszaadja az utolsó azonosító értéket, amelyet a megadott táblához bármely ülésen és bármely hatókörben generáltak Íme egy példa, hogy jól szemléltessem a különbségeiket
-- a) Mintakód -- =========================================== -- Készíts teszttáblát -- =========================================== HASZNÁLD tempdb-t MENJ
CREATE TABLE t1(id int IDENTITY,col int) INSERT t1 SELECT 1 UNION ALL SELECT 2 CREATE TABLE t2(id int IDENTITY,col int) MENJ
CREATE TRIGGER TR_insert_t2 T2-N BEILLESZTÉSHEZ MINT BESZEKELNI T1 SELECT 3 MENJ
-- =========================================== -- Három funkciót tesztelj: 1 -- =========================================== BESZÚRD T2 ÉRTÉKEKET(1) SELECT [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), [@@IDENTITY]=@@IDENTITY, [IDENT_CURRENT() For t1]=IDENT_CURRENT(N't1'), [IDENT_CURRENT() A t2 esetén]=IDENT_CURRENT(N't2')
/*--Eredmény SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() A t1 IDENT_CURRENT() A t2 esetén ------------------ ------------ -------------------------- ----------------------- 1 3 3 1
(Az érintett sorok száma 1 sor) --*/ MENJ
-- =========================================== -- Három funkciót tesztelj: 2 -- =========================================== BEHELYEZZÜNK T1 ÉRTÉKEKET(10) SELECT [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), [@@IDENTITY]=@@IDENTITY, [IDENT_CURRENT() For t1]=IDENT_CURRENT(N't1'), [IDENT_CURRENT() A t2 esetén]=IDENT_CURRENT(N't2')
/*--Eredmény SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() A t1 IDENT_CURRENT() A t2 esetén ------------------ ------------ -------------------------- ----------------------- 4 4 4 1
(Az érintett sorok száma 1 sor) --*/ MENJ
-- =========================================== -- Három funkciót tesztelj: 3 -- ** Nyiss új kapcsolatot, és hajtsd végre a következő kódot ** -- =========================================== SELECT [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), [@@IDENTITY]=@@IDENTITY, [IDENT_CURRENT() For t1]=IDENT_CURRENT(N't1'), [IDENT_CURRENT() A t2 esetén]=IDENT_CURRENT(N't2')
/*--Eredmény SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() A t1 IDENT_CURRENT() A t2 esetén ------------------ ------------ -------------------------- ----------------------- NULL NULL 4 &n
--=========================================== -- Töröld a tesztkörnyezetet -- =========================================== DOBD LE TÁBLÁZATOT T1, t2
-- b) Kód eredményleírás Ahogy a fenti kódból is látható: IDENT_CURRENT() mindig a megadott táblában beillesztett utoljára azonosított értéket adja vissza @@IDENTITY A jelenlegi munkafolyamat identitásértékét adja vissza, akár ugyanabban a hatókörben, akár nem, az 1. és 2. tesztben látható, hogy a beillesztett rekord identitásának értékét adja vissza a triggerben, és a
A 3. tesztben a NULL visszatér, mert a jelenlegi ülésben nincs beillesztési rekord SCOPE_IDENTITY() adja vissza ugyanennek a kiemelkedőségnek az azonosító értékét a jelenlegi ülésszak esetében, tehát az 1, 2. tesztben azt az értéket adja vissza, amelyet a trigger nem érint, a 3. tesztben pedig azért, mert az aktuális ülés nincs interpolálva
rekord, így a NULL visszaadja
|