Funktion för att hämta identifieringsvärde i SQL SERVER 2000 I SQL Server 2000 definieras identitetskolumnen av IDENTITY, och följande är relaterat till att få identitetsvärdet för den senast insatta posten
Ett exempel på funktionen av av
I SQL Server kan du använda SCOPE_IDENTITY(), @@IDENTITY, IDENT_CURRENT() för att få värdet på den senast insatta posten, och skillnaden mellan dem är: SCOPE_IDENTITY() returnerar det senaste IDENTITY-värdet som infogades i kolumnen IDENTITY i samma scope. Ett scope är en modul – lagrade procedurer, triggers, funktioner
Antal eller batcher. Därför, om två satser är i samma lagrade procedur, funktion eller batch, är de i samma scope. @@IDENTITY Returnerar det senaste identifieringsvärdet som genererats i alla tabeller i den aktuella sessionen IDENT_CURRENT() returnerar det senaste identifieringsvärdet som genererats för den angivna tabellen i varje session och varje omfattning Här är ett exempel för att illustrera deras skillnader
-- a) Exempelkod -- =========================================== -- Skapa en testtabell -- =========================================== ANVÄND tempdb KÖR
SKAPA TABELL t1(id int IDENTITY,col int) INFOGA t1 VÄLJ 1 UNION ALLA VÄLJ 2 CREATE TABLE t2(id int IDENTITY,col int) KÖR
SKAPA TRIGGER TR_insert_t2 PÅ T2 FÖR INSATS AS INFOGA t1 VÄLJ 3 KÖR
-- =========================================== -- Testa tre funktioner: 1 -- =========================================== INFOGA t2-VÄRDEN(1) VÄLJ [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), [@@IDENTITY]=@@IDENTITY, [IDENT_CURRENT() För t1]=IDENT_CURRENT(N't1'), [IDENT_CURRENT() För t2]=IDENT_CURRENT(N't2')
/*--Resultat SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() För t1 IDENT_CURRENT() För t2 ------------------ ------------ -------------------------- ----------------------- 1 3 3 1
(Antalet rader som påverkas är 1 rad) --*/ KÖR
-- =========================================== -- Testa tre funktioner: 2 -- =========================================== INFOGA T1-VÄRDEN(10) VÄLJ [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), [@@IDENTITY]=@@IDENTITY, [IDENT_CURRENT() För t1]=IDENT_CURRENT(N't1'), [IDENT_CURRENT() För t2]=IDENT_CURRENT(N't2')
/*--Resultat SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() För t1 IDENT_CURRENT() För t2 ------------------ ------------ -------------------------- ----------------------- 4 4 4 1
(Antalet rader som påverkas är 1 rad) --*/ KÖR
-- =========================================== -- Testa tre funktioner: 3 -- ** Öppna en ny anslutning och kör följande kod ** -- =========================================== VÄLJ [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), [@@IDENTITY]=@@IDENTITY, [IDENT_CURRENT() För t1]=IDENT_CURRENT(N't1'), [IDENT_CURRENT() För t2]=IDENT_CURRENT(N't2')
/*--Resultat SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() För t1 IDENT_CURRENT() För t2 ------------------ ------------ -------------------------- ----------------------- NULL NULL 4 &n
--=========================================== -- Ta bort testmiljön -- =========================================== SLÄPP TABELL t1,t2
-- b) Kodresultatbeskrivning Som du kan se från koden ovan: IDENT_CURRENT() returnerar alltid det senast identifierade värdet som infogades i den angivna tabellen @@IDENTITY Returnerar identitetsvärdet för den aktuella sessionen, oavsett om den är i samma omfattning eller inte, i test 1 och 2, kan man se att den returnerar identitetsvärdet för den infogade posten i triggern, och i
I Test 3 returneras NULL eftersom det inte finns någon insättningspost i den aktuella sessionen SCOPE_IDENTITY() returnerar identifieringsvärdet för samma omfattning som den aktuella sessionen, så i test 1, 2 returnerar den värdet som inte påverkas av triggern, och i test 3, eftersom den aktuella sessionen inte interpoleras
post, så den returnerar NULL
|