---
title: "SCOPE_IDENTITY() OCH @@IDENTITY"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/101487-scope-identity-och-identity"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "Nöff"
published: "2004-04-14T17:54:20.000Z"
updated: "2004-04-15T07:47:39.000Z"
replies: 14
views: 547
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/101487-scope-identity-och-identity"
---

# SCOPE_IDENTITY() OCH @@IDENTITY

## #1 — Nöff, 2004-04-14T17:54Z

Nån som vet vad är det för skillnad på SCOPE_IDENTITY() OCH @@IDENTITY?

Permalänk: https://www.webforum.nu/p/101487

## #2 — PDahlen, 2004-04-14T19:13Z

Här är en beskrivning av detta:
<http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_sa-ses_6n8p.asp>
Började skriva förklaringen här men jag tror att det är bättre att läsa direkt. ;)

Permalänk: https://www.webforum.nu/p/1321196

## #3 — Engine^, 2004-04-14T19:33Z

Tro om det kan förklaras såhär:

@@IDENTITY returnerar det senaste ID:t från den sista tabellen som påverkades av den fråga du körde.

SCOPE_IDENTITY returnerar det ID som skapades i den tabell som din fråga först påverkade.

...möjligen.

Permalänk: https://www.webforum.nu/p/1321206

## #4 — Nöff, 2004-04-14T19:45Z

> @@IDENTITY returnerar det senaste ID:t från den sista tabellen som påverkades av den fråga du körde.

 

hmm, kan det månne vara så att @@IDENTITY returnerar sista INSERT:ade ID:et oavsett vilken tabell?. 

Sen har vi **IDENT_CURRENT** som också är en "ID-urplockare" för att lägga lite salt i såret.
Står såhär om den:Returns the last identity value generated for a specified table in any session and any scope. 

fan , svårt det här
 :l

Permalänk: https://www.webforum.nu/p/1321214

## #5 — PDahlen, 2004-04-14T20:12Z

Japp, det stämmer att @@IDENTITY returnerar sista INSERT:ade ID:et oavsett tabell. Men det gör Scope_Identity också, så länge det är i samma "scope", t.ex. samma procedur.
I exemplet på msdn så visas det på ett rätt bra sätt. I procen görs en INSERT. Om det inte fanns någon trigger så skulle @@IDENTITY och Scope_Identity returnera samma sak. Men eftersom denna INSERT triggar en annan INSERT så ändras detta. Scope_Identity returnerar ID från den första INSERTen eftersom den skedde i samma "scope", i detta fall samma procedur. @@IDENTITY returnerar ID från den andra INSERTen, den i Triggern, eftersom den skedde sist och vi fortfarande befinner oss i samma session.

IDENT_Current returnerar däremot det sist inlagda ID:t på en angiven tabell. Med andra ord kan du göra INSERTs i tabellerna TZ och TY och ändå få ut senaste ID från en helt annan tabell, t.ex. TX.

Hmm, mycket att tänka på ibland men det är bra att veta om att det finns. Det dyker säkert upp tillfället då detta är väldigt användbart.

Permalänk: https://www.webforum.nu/p/1321223

## #6 — Engine^, 2004-04-14T20:56Z

> **PDahlen skrev:**
>
> Hmm, mycket att tänka på ibland men det är bra att veta om att det finns. Det dyker säkert upp tillfället då detta är väldigt användbart.

Hur fungerar SQL Scope med transaktioner? Där skulle det ju vara intressant, eftersom då kan man inte lita på @@IDENTITY. Det känns som om det är där SCOPE_IDENTITY() blir vettigt.

Annars tycker jag nog att det är trevligare att hålla reda på mycket viktiga värden själv.

Permalänk: https://www.webforum.nu/p/1321249

## #7 — Nöff, 2004-04-14T21:59Z

...

> Hmm, mycket att tänka på ibland men det är bra att veta om att det finns. Det dyker säkert upp tillfället då detta är väldigt användbart.

 

Fint. Jag ska använda den i en transaktion, Vilken är den bästa ID-plockaren att använda då tro?, om jag under transaktionen ska hämta ID från flera tabeller?, borde scope räcka om jag lägger SELECT SCOPE() i samma INSERT sats?, och kör iväg med en command.executeScalar() ?, CURRENT kanske inte lämpar sig eftersom den inte tar i samma session?, det är ju viktigt att ID:et tillhör min transaktion session ju.

Permalänk: https://www.webforum.nu/p/1321291

## #8 — PDahlen, 2004-04-15T06:29Z

Själv så använder jag alltid @@IDENTITY. Detta pga att det hittills alltid har varit det senast inlagda ID jag är ute efter.
Men egentligen så funkar det med alla 3 så länge du lägger dem på rätt ställe i transaktionen. Om du gör flera INSERTs och ska ha ut flera ID så måste du lagra ID-numren i OUTPUT variabler och då kan man ju köra en @@IDENTITY efter varje INSERT.

Permalänk: https://www.webforum.nu/p/1321327

## #9 — Nöff, 2004-04-15T07:27Z

så.

```
command.commandtext="INSERT INTO tabell (namn) VALUES ('hej') SELECT SCOPE_IDENTITY()";
int ID=Convert.toInt32(command.executescalar())
```

Torde då bli bra va?, eftersom SCOPE är ju också inom samma scope, @@IDENTITY är ju inte det.

Permalänk: https://www.webforum.nu/p/1321345

## #10 — PDahlen, 2004-04-15T07:29Z

Ja, det där borde funka fint och om jag förstått allt vi pratat om så skulle

```
command.commandtext="INSERT INTO tabell (namn) VALUES ('hej') SELECT @@IDENTITY";
int ID=Convert.toInt32(command.executescalar())
```

returnera samma sak.

Grabbar, har vi lärt oss något? :)
Tjohoo, något att skriva om i bloggen.

Permalänk: https://www.webforum.nu/p/1321346

## #11 — LarsG, 2004-04-15T07:34Z

Om det finns en trigger definerad för tabell där man gör insert på en (annan) tabell med identity-attribut så blir det inte samma sak.

```
command.commandtext="set nocount on INSERT INTO tabell (namn) VALUES ('hej') SELECT @@IDENTITY";
int ID=Convert.toInt32(command.executescalar())
```

Permalänk: https://www.webforum.nu/p/1321348

## #12 — Nöff, 2004-04-15T07:39Z

en sista fråga bara innan jag lägger in den i min kod.
Är det nödvändigt att separera med ett ; mellan INSERT satsen och SELECT SCOPE/@@IDENTITY ?

Det funkar både och, men vad är bäst?

Permalänk: https://www.webforum.nu/p/1321350

## #13 — PDahlen, 2004-04-15T07:39Z

Precis, det var vad vi kom fram till tidigare i inläggen. ;)

Permalänk: https://www.webforum.nu/p/1321351

## #14 — PDahlen, 2004-04-15T07:41Z

En fråga bara.
Nöff, kör du SQL Server? I så fall använd en Stored Procedure. Om du kör nåt annat ignorera detta inlägg. :)

Permalänk: https://www.webforum.nu/p/1321353

## #15 — Nöff, 2004-04-15T07:47Z

jo jag borde använda sp dock. hehe

Permalänk: https://www.webforum.nu/p/1321356

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/101487-scope-identity-och-identity
