Kilde: Internet Forfatter: Ukendt
- Opret databaser og tabeller
Opret database MyDataBase
brug MyDataBase
Opret tabel mytable
id int identitet(1,1),
Navn Varchar(20)
)
--Udfør denne SQL for at finde værdien af den selv-inkrementelle kolonne, der svarer til den post, der netop er indsat
indsæt i mytable værdier('Li Si')
Vælg @@identity
2. Sammenligning af de tre metoder
I SQL Server 2000 er der tre lignende funktioner: SCOPE_IDENTITY, IDENT_CURRENT og @@IDENTITY, som alle returnerer værdier indsat i IDENTITY-kolonnen.
IDENT_CURRENT Returnerer den sidst genererede identifikationsværdi for en specifik tabel i enhver session og ethvert scope. IDENT_CURRENT Ikke begrænset af omfang og session, men af en specificeret tabel. IDENT_CURRENT Returnerer værdien genereret for en specifik tabel i enhver session og omfang.
@@IDENTITY Returnerer den sidste identifikationsværdi, der er genereret for en hvilken som helst tabel i alle scopes af den aktuelle session.
SCOPE_IDENTITY Returnerer den sidst identificerede værdi, der blev genereret for den aktuelle session og enhver tabel i det aktuelle omfang
SCOPE_IDENTITY og @@IDENTITY returnerer den sidste identifikationsværdi, der blev genereret i en hvilken som helst tabel i den aktuelle session. Dog returnerer SCOPE_IDENTITY kun værdier, der er indsat i det aktuelle scope; @@IDENTITY Ikke begrænset til et specifikt omfang.
For eksempel er der to tabeller, T1 og T2, hvor en INSERT-trigger er defineret. Når en række indsættes i T1, udløses triggeren, og en række indsættes i T2. Dette eksempel illustrerer to scopes: et på T1 og et på T2 som følge af triggeren.
Hvis både T1 og T2 har IDENTITY-kolonner, vil @@IDENTITY og SCOPE_IDENTITY returnere forskellige værdier i slutningen af INSERT-sætningen på T1.
@@IDENTITY Returnerer den sidste IDENTITY-kolonneværdi, der er indsat i et hvilket som helst scope i den aktuelle session, hvilket er værdien indsat i T2.
SCOPE_IDENTITY() returnerer IDENTITY-værdien indsat i T1, som er den sidste INSERT, der fandt sted i samme scope. Hvis funktionen SCOPE_IDENTITY() kaldes, før indsættelsessætningen til identitetskolonnen sker i scope, returnerer funktionen en NULL-værdi.
De værdier, der returneres af IDENT_CURRENT('T1') og IDENT_CURRENT('T2'), er henholdsvis de sidste selv-inkrementelle værdier af de to tabeller.
ajqc's eksperiment: (40 lokale tråde, 40+40 fjerntråde samtidig test, indsættelse af 1200W rækker), konklusionen er:
1. I typiske kaskaderingsapplikationer. @@IDENTITY kan ikke bruges, og samtidige konflikter vil opstå, når 1W er fler-række på CII850, 256M SD-maskiner. På P42.8C og 512M DDR er der en samtidig konflikt, hvor der kun er mere end 6000 linjer.
2.SCOPE_IDENTITY() er fuldstændig pålidelig og kan bruges i lagringsprocessen, selv triggere behøver ikke at blive bygget, og der er ingen samtidige konflikter
SELECT IDENT_CURRENT('TableName') - Returnerer den sidste labelværdi, der er genereret i den angivne tabel
SELECT IDENT_INCR('TableName') - returnerer den markerede feltinkrementværdi for den angivne tabel
SELECT IDENT_SEED('TableName') - returnerer den markerede feltseed-værdi for den angivne tabel
Returnerer det automatiske nummer for den sidst indsatte post
VÆLG IDENT_CURRENT('TableName')
Gå tilbage til det næste automatiske nummer:
VÆLG IDENT_CURRENT('TableName')+(VÆLG IDENT_INCR('TableName'))
SELECT @@IDENTITY - Returnerer den sidst markerede værdi, der blev genereret i alle tabeller i den aktuelle session
|