Hvad er den bedste måde at få fat i `IDENTITY` for den indsatte række?


Jeg kender til `@@IDENTITY` og `IDENT_CURRENT` og `SCOPE_IDENTITY`, men forstår ikke fordele og ulemper ved hver af dem.


Er der nogen, der kan forklare forskellene, og hvornår jeg skal bruge hver enkelt?


Bedste måde at få identiteten af den indsatte række på?
=======================================================


* [`@@IDENTITY`](https://msdn.microsoft.com/en-us/library/ms187342.aspx) returnerer den sidste identitetsværdi, der er genereret for en hvilken som helst tabel i den aktuelle session, på tværs af alle områder. **Du skal være forsigtig her**, da det er på tværs af scopes. Du kunne få en værdi fra en trigger i stedet for din aktuelle erklæring.
* [`SCOPE_IDENTITY()`](https://msdn.microsoft.com/en-us/library/ms190315.aspx) returnerer den sidste identitetsværdi, der er genereret for et hvilket som helst bord i den aktuelle session og det aktuelle scope. **Generelt set det, du ønsker at bruge**.
* [`IDENT_CURRENT('tableName')`](https://msdn.microsoft.com/en-us/library/ms175098.aspx) returnerer den sidste identitetsværdi, der er genereret for en bestemt tabel i en hvilken som helst session og et hvilket som helst omfang. Dette giver dig mulighed for at angive hvilken tabel du vil have værdien fra, hvis de to ovenstående ikke helt er det du har brug for (**meget sjældent**). Som @[Guy Starbuck](https://stackoverflow.com/questions/42648/best-way-to-get-identity-of-inserted-row#42665) nævnte, "Du kan også bruge dette, hvis du ønsker at få den aktuelle IDENTITY-værdi for en tabel, som du ikke har indsat en post i."
* Med [`OUTPUT`-klausulen](https://msdn.microsoft.com/en-us/library/ms177564.aspx) i `INSERT`-erklæringen får du adgang til alle de rækker, der blev indsat via den pågældende erklæring. Da den er begrænset til den specifikke erklæring, er den **mere ligetil** end de andre funktioner ovenfor. Den er dog lidt **mere omstændelig** (du skal indsætte i en tabelvariabel/temp tabel og derefter spørge om den), og den giver resultater selv i et fejlscenarie, hvor erklæringen rulles tilbage. Når det er sagt, hvis din forespørgsel bruger en parallel udførelsesplan, er dette den **eneste garanterede metode** til at få identiteten (bortset fra at slå parallelisme fra). Den udføres dog *før* triggere og kan ikke bruges til at returnere værdier, der er genereret af triggere.

[MSDN](https://msdn.microsoft.com/en-us/library/aa933167(SQL.80).aspx)



> 
> @@IDENTITY, SCOPE\_IDENTITY og IDENT\_CURRENT er funktioner, der ligner hinanden, idet de returnerer den sidste værdi, der er indsat i IDENTITY-kolonnen i en tabel.
> 
> 
> 



> 
> @@IDENTITY og SCOPE\_IDENTITY returnerer den sidste identitetsværdi, der er genereret i en hvilken som helst tabel i den aktuelle session. SCOPE\_IDENTITY returnerer dog kun værdien inden for det aktuelle anvendelsesområde; @@IDENTITY er ikke begrænset til et bestemt anvendelsesområde.
> 
> 
> 



> 
> IDENT\_CURRENT er ikke begrænset af anvendelsesområde og session; den er begrænset til en bestemt tabel. IDENT\_CURRENT returnerer den identitetsværdi, der er genereret for et bestemt bord i enhver session og ethvert anvendelsesområde. Yderligere oplysninger findes under IDENT\_CURRENT.
> 
> 
> 


* IDENT\_CURRENT][2](https://msdn.microsoft.com/en-us/library/aa933217(SQL.80).aspx) er en funktion, der tager en tabel som argument.
* [@@IDENTITY](https://msdn.microsoft.com/en-us/library/aa933167(SQL.80).aspx) kan returnere et forvirrende resultat, hvis du har en trigger på tabellen
* [SCOPE\_IDENTITY](https://msdn.microsoft.com/en-us/library/aa259185(SQL.80).aspx) er din helt det meste af tiden.

**@@IDENTITY** er den sidste identitet, der er indsat med den aktuelle SQL-forbindelse. Dette er en god værdi at returnere fra en insert-stored procedure, hvor du kun har brug for den identitet, der er indsat for din nye post, og hvor du er ligeglad med, om der efterfølgende er tilføjet flere rækker.


**SCOPE\_IDENTITY** er den sidste identitet, der er indsat ved hjælp af den aktuelle SQL-forbindelse og i det aktuelle scope - dvs. hvis der blev indsat en anden IDENTITY baseret på en trigger efter din indsættelse, ville det ikke blive afspejlet i SCOPE\_IDENTITY, kun i den indsættelse, du foretog. Ærligt talt har jeg aldrig haft en grund til at bruge dette.


**IDENT\_CURRENT(tablename)** er den sidst indsatte identitet uanset forbindelse eller omfang. Du kan bruge dette, hvis du ønsker at få den aktuelle IDENTITY-værdi for en tabel, som du ikke har indsat en post i.

