webForumDet fria alternativet

Hur får man tag i @@IDENTITY

Databaser & SQL

13 svar · 401 visningar · startad av lolukokasos

Medlem sedan mars 2001196 inlägg
Frågan#1

Jag har en kod som kan se ut så här:

INSERT INTO tabell(fält...)
SELECT fält... FROM tabell WHERE villkor

Varje gång en insert görs vill jag ifall en post är av ett visst slag göra in insert i en annan tabell och då vill jag veta @@IDENTITY från insert'en enligt ovan.

Jag vill helst göra detta med ren SQL direkt i MSSQL.

Medlem sedan feb. 200112 078 inlägg
#2
SQL = "SELECT [red]last_insert_id[/red] FROM table"

Diskuterades här.

Medlem sedan mars 2001196 inlägg
#3

OveRRide: Jag vet inte riktigt vad du menar med last_inserted_id, men det var väl till MYSQL och inte MSSQL?

Problemet är att jag vill göra en "bulk insert" (tror jag..), alltså många rader genom att ställa en select-fråga. Radernas @@IDENTITY vill jag ha tag i, inte bara den sista utan alla raders identity.

Går det?

Medlem sedan feb. 200112 078 inlägg
#4

Oj! Jag läste fel. :r

Du, det där får du nog ta med LarsG tror jag, för det är 'way out of my league' så att säga. ;)

Medlem sedan mars 2001196 inlägg
#5

:) OveRRide: du är redan förlåten, det är kul att det finns människor som bryr sig om mina problem. :)

Medlem sedan juni 200032 967 inlägg
#6

Jag är inte säker på att jag förstår problemet.

INSERT INTO blah (......
INSERT INTO blahblah (blahID) VALUES (@@identity)

Borde väl fungera?

Mvh,

Medlem sedan mars 2001196 inlägg
#7

@nders, jag skulle gärna vilja göra som du sa, jag tror du menar så här:


INSERT INTO ELement(dbId,eleVarde,eleTypId)
SELECT 40,eleVarde, eleTypId	
FROM Element
WHERE dbId=39
AND eleTypId=4

INSERT INTO ElementTabell(eleId,artNr,pris)
SELECT @@IDENTITY,artNr,pris 
FROM ElementTabell et,Element e
WHERE e.eleId=@@IDENTITY
AND e.eleTypId=4

Problemet är att jag bara får med den sista insertade radens IDENTITY, i mitt fall handlar det om att jag i första INSERT (ovan) har 7 olika rader (7 olika IDENTITY). I den andra INSERT så har jag bara IDENTITY från den sista raden i första INSERT. Koden ovan ger fel resultat.

Blev det mer förståeligt?

Medlem sedan juni 200032 967 inlägg
#8

Ok, jag gör en liten chansning:

declare @myID int

INSERT INTO ELement(dbId,eleVarde,eleTypId)
SELECT 40,eleVarde, eleTypId	
FROM Element
WHERE dbId=39
AND eleTypId=4

select @myID = @@identity
INSERT INTO ElementTabell(eleId,artNr,pris)
SELECT @myID,artNr,pris 
FROM ElementTabell et,Element e
WHERE e.eleId=@myID
AND e.eleTypId=4

Använd @myID istället, och sätt om det om du vill ha ett annat räknarvärde. Inte helt med på allt dock... :OO

Mvh,

Medlem sedan mars 2001196 inlägg
#9

@nders:
Det gav samma resultat.
@myID enligt ovan får bara värdet på sista raden från den första INSERT.

Jag skulle vilja göra den andra INSERT efter varje rads insert i den första INSERT.

Oj, belv det nåt mer förståeligt så... :)

Medlem sedan juni 200032 967 inlägg
#10

Jag förstår ingenting.

Medlem sedan mars 2001196 inlägg
#11

Följande kod:

INSERT INTO ELement(dbId,eleVarde,eleTypId)
SELECT 40,eleVarde, eleTypId	
FROM Element
WHERE dbId=39
AND eleTypId=4

...tar fram sju rader ur Element och sätter nytt dbId (40) och sen görs INSERT i tabellen Element (en slags kopiering).

Följande kod ska använda @@identity från alla rader ovan (7 olika identity) för att göra INSERT i tabellen ElementTabell....

select @myID = @@identity
INSERT INTO ElementTabell(eleId,artNr,pris)
SELECT @myID,artNr,pris 
FROM ElementTabell et,Element e
WHERE e.eleId=@myID
AND e.eleTypId=4

... Detta betyder att alla rader som väljs ut från SELECT inte ska ha samma eleId (@myID), utan IDENTITY från respektive rad från den först koden ovan.

Jag vet inte om jag kan förklara det på något annat sätt. Du kanske kan berätta vad du inte förstår.

Medlem sedan juni 200032 967 inlägg
#12

Med den förklaringen förstår jag, men jag kan inte se att du kan göra det med en sådan SQL-fråga. Din insert får bara lägga till en post i taget om du ska kunna använda @@identity.

Alltså behöver du då någon loop, antingen i en stored procedure, eller mha något scriptspråk eller annan applikation.

Mvh,

Medlem sedan mars 2001196 inlägg
#13

Okej, så man kan inte få tag i @@IDENTITY vid en bulk insert.

Jag gör gärna det här via SP men frågan kvarstår hur jag bygger upp "loopen" för det.

Någon som har någon idé?

Medlem sedan juni 200032 967 inlägg
#14

Nu var det mycket länge sedan jag jobbade med stored procedures och cursors.

Men sökord för farbror google (eller books on line): Stored procedure samt cursor.

Lycka till!

Mvh,

270 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
142 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)