Avatar billede wedia Nybegynder
27. november 2008 - 14:32 Der er 9 kommentarer og
1 løsning

problem med T-SQL

Hej Eksperter,

jeg har et problem med T-SQL. Jeg har en stored procedure som opretter en ny side hvilket ikke er noget problem. Problemet ligger i at jeg har en anden table der indeholder gamle versioner af de enkelte sider så man altid kan hente en gamle version frem og bruge istedet for den nyeste, og ved oprettelse af nye sider skal der også oprettes en ny "history" side med en id ref. til siden i hovedet tabelen. Mit spørgsmål kan man og hvis ja hvordan kan man hente og bruge det id som den nye side får af db'en ved oprettelse og bruge ved oprettelsen af "history" udgaven i samme SP
Avatar billede softspot Forsker
27. november 2008 - 14:39 #1
Tænker du på at hente ID for det senest tilføjede element i én tabel ud i en variabel, så vil jeg mene dette kan bruges:

INSERT INTO tabel1(felt1,felt2)
VALUES(@felt1,@felt2)

SET @nytid = @@IDENTITY

INSERT INTO tabel2(refid, felt1)
VALUES(@nytid, @andetfelt1)
Avatar billede arne_v Ekspert
27. november 2008 - 14:42 #2
Det er måden.

Bemærk at man ikke behøver en temp variabel.

INSERT INTO tabel1(felt1,felt2)
VALUES(@felt1,@felt2)

INSERT INTO tabel2(refid, felt1)
VALUES(@@IDENTITY, @andetfelt1)

Og strengt taget er det bedre at bruge SCOPE_IDENTITY() end @@IDENTITY.

INSERT INTO tabel1(felt1,felt2)
VALUES(@felt1,@felt2)

INSERT INTO tabel2(refid, felt1)
VALUES(SCOPE_IDENTITY(), @andetfelt1)
Avatar billede wedia Nybegynder
27. november 2008 - 14:59 #3
Perfect smid et svar!! :)
Avatar billede wedia Nybegynder
27. november 2008 - 15:00 #4
hvad er forskellen på  SCOPE_IDENTITY() og @@IDENTITY.
Avatar billede softspot Forsker
27. november 2008 - 15:16 #5
SCOPE_IDENTITY sikrer, at du får den sidste id den session der har indsat data i tabellen har oprettet. @@IDENTITY er den sidste id på et globalt niveau og altså lidt "farlig" i et travlt miljø, hvor der sker mange opdateringer.
Avatar billede arne_v Ekspert
27. november 2008 - 15:20 #6
Ikke rigtigt.

SCOPE_IDENTITY() og @@IDENTITY er begge for samme connection, så ingen af dem
har samtidigheds problemer. Der er en tredie funktion som går på tværs af
connections.

Problemer med @@IDENTITY er triggers. Hvis din første INSERT har en trigger som
laver en ny INSERT som genererer en identity, så vil @@IDENTITY indeholde
den nye identity mens SCOPE_IDENTITY() vil indeholde identity fra din INSERT.
Avatar billede softspot Forsker
27. november 2008 - 15:25 #7
hmm... jeg må vist have læst om dette igen...
Avatar billede wedia Nybegynder
29. november 2008 - 13:47 #8
tak for hjælpen!!
Avatar billede softspot Forsker
30. november 2008 - 16:23 #9
Hov!? Skulle arne_v ikke have haft nogle point. Han kom trods alt med en bedre løsning og det rigtige svar på tillægsspørgsmålet.

Jeg har lagt 100 point til dig, arne_v, på dette indlæg: http://www.eksperten.dk/spm/854732
Avatar billede softspot Forsker
30. november 2008 - 16:24 #10
Tak for point i øvrigt :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester