Funktion til identifikationsværdihentning i SQL SERVER 2000 I SQL Server 2000 defineres identitetskolonnen af IDENTITY, og følgende er relateret til at hente identitetsværdien for den sidst indsatte post
Et eksempel på en illustration af funktionen af off
I SQL Server kan du bruge SCOPE_IDENTITY(), @@IDENTITY, IDENT_CURRENT() til at få værdien af den sidst indsatte post, og forskellen mellem dem er: SCOPE_IDENTITY() returnerer den sidste IDENTITY-værdi, der er indsat i IDENTITY-kolonnen i samme scope. Et scope er et modul – lagrede procedurer, triggere, funktioner
Numre eller partier. Derfor, hvis to udsagn er i samme lagrede procedure, funktion eller batch, er de i samme scope. @@IDENTITY Returnerer den sidst genererede identifikationsværdi i alle tabeller i den aktuelle session IDENT_CURRENT() returnerer den sidst genererede identifikationsværdi for den angivne tabel i enhver session og ethvert omfang Her er et eksempel til at illustrere deres forskelle
-- a) Eksempelkode -- =========================================== -- Opret en testtabel -- =========================================== BRUG tempdb GÅ
CREATE TABLE t1(id int IDENTITY,col int) INDSÆT t1 VÆLG 1 UNION ALLE VÆLG 2 CREATE TABLE t2(id int IDENTITY,col int) GÅ
OPRET TRIGGER TR_insert_t2 PÅ T2 FOR INSERT AS INDSÆT t1 VÆLG 3 GÅ
-- =========================================== -- Test tre funktioner: 1 -- =========================================== INDSÆT t2-VÆRDIER(1) VÆLG [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), [@@IDENTITY]=@@IDENTITY, [IDENT_CURRENT() For t1]=IDENT_CURRENT(N't1'), [IDENT_CURRENT() For t2]=IDENT_CURRENT(N't2')
/*--Resultat SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() For t1 IDENT_CURRENT() For t2 ------------------ ------------ -------------------------- ----------------------- 1 3 3 1
(Antallet af berørte rækker er 1 række) --*/ GÅ
-- =========================================== -- Test tre funktioner: 2 -- =========================================== INDSÆT t1-VÆRDIER(10) VÆLG [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), [@@IDENTITY]=@@IDENTITY, [IDENT_CURRENT() For t1]=IDENT_CURRENT(N't1'), [IDENT_CURRENT() For t2]=IDENT_CURRENT(N't2')
/*--Resultat SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() For t1 IDENT_CURRENT() For t2 ------------------ ------------ -------------------------- ----------------------- 4 4 4 1
(Antallet af berørte rækker er 1 række) --*/ GÅ
-- =========================================== -- Test tre funktioner: 3 -- ** Åbn en ny forbindelse og udfør følgende kode ** -- =========================================== VÆLG [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), [@@IDENTITY]=@@IDENTITY, [IDENT_CURRENT() For t1]=IDENT_CURRENT(N't1'), [IDENT_CURRENT() For t2]=IDENT_CURRENT(N't2')
/*--Resultat SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() For t1 IDENT_CURRENT() For t2 ------------------ ------------ -------------------------- ----------------------- NULL NULL 4 &n
--=========================================== -- Slet testmiljøet -- =========================================== DROP-TABEL T1,T2
-- b) Beskrivelse af koderesultater Som du kan se fra koden ovenfor: IDENT_CURRENT() returnerer altid den sidst identificerede værdi, der er indsat i den angivne tabel @@IDENTITY Returnerer identitetsværdien for den aktuelle session, uanset om den er i samme scope eller ej, i test 1 og 2, kan det ses, at den returnerer identitetsværdien for den indsatte post i triggeren, og i
I Test 3 returneres NULL, fordi der ikke er nogen indsættelsespost i den aktuelle session SCOPE_IDENTITY() returnerer identifikationsværdien for samme omfang som den aktuelle session, så i test 1, 2 returnerer den værdi, der ikke påvirkes af triggeren, og i test 3, fordi den aktuelle session ikke interpoleres
record, så den returnerer NULL
|