Avatar billede thomasabcd Nybegynder
24. juni 2005 - 15:53 Der er 11 kommentarer og
1 løsning

INSERT og UPDATE i samme query ?

Jeg vil gerne indsætte en række hvor en af værdierne består af en kombination af det unikke id, som rækken får, og en anden værdi. I dette eksempel vil jeg gerne lave et AppointmentHandle, som består af AppointmentName + unik id.
Noget a la det her (som ikke virker):

INSERT INTO Appointments
                      (AppointmentName, AppointmentHandle)
VALUES    (@AppointmentName,@AppointmentName + '-' + STR(@@IDENTITY))

Ovenstående query indsætter godt nok en række med et AppointmentName, men AppointHandle får tildelt NULL. Det er et eller andet med @@Identity, der går galt, for hvis jeg hardcoder et tal, virker det fint
Avatar billede arne_v Ekspert
24. juni 2005 - 15:58 #1
jeg tror ikke at du kan bruge @@IDENTITY førend INSERT er udført

det er også i modstrid med alle teorier om relations databaser at gemme
redundant data på den måde - hvorfor konstrurerer du ikke den
størrelse når du henter ud ?
Avatar billede thomasabcd Nybegynder
24. juni 2005 - 16:02 #2
Det er et forsøg på at lave et sammensat id, som jeg kan addressere rækken med. Det er måske ikke den mest optimale måde at gøre det på, så andre forslag modtages gerne. Det SKAL dog være en kombination af AppointmentName og et unikt nummer
Avatar billede mnoer Nybegynder
24. juni 2005 - 16:15 #3
@@identity får tildelt det sidst "automatisk tildelte" id i den session du har gang i. Hvis du ikke har lavet en insert hvor der indgår et felt med identity, så er @@identity = null. hvis du bare skal have et unikt id i AppointmentHandle skal du bare sætte identity på den kolonne.
Avatar billede thomasabcd Nybegynder
24. juni 2005 - 16:23 #4
jeg er nybegynder i MS SQL, så muligvis er det min manglende forståelse, der gør det, men hvis der er angivet en identity-column i min tabel, er det så ikke den, som @@IDENTITY refererer til (i nedenstående eksempel altså "AppointmentID") ?
En simpel version af min tabel består af følgende:
AppointmentID (int og primary key). Den inkrementeres med 1, når der indsættes data
AppointmentName (string).
AppointmentHandle (string). Denne skal være unik, og AppointmentName, skal indgå som en del af værdien.
Avatar billede arne_v Ekspert
24. juni 2005 - 16:26 #5
@@IDENTITY refererer til sidste genererede værdi for all identity kolonner på connection
Avatar billede thomasabcd Nybegynder
24. juni 2005 - 16:30 #6
Så skal det gøres af to omgange ? A la:
INSERT INTO Appointments (AppointmentName)
VALUES @AppointmentName)

UPDATE    Appointments
SET      AppointmentHandle = @AppointmentName + '-' + @@IDENTITY
WHERE    AppointmentID = @@IDENTITY

Hvis ja, hvordan får jeg den til at køre de querys i samme omgang ?
Avatar billede mnoer Nybegynder
24. juni 2005 - 16:33 #7
et felt med identity skal/kan du ikke indsætte en værdi i, det gør DB'en selv når du indsætter en række.
med @@identity kan du så hente det id DB'en lige har tildelt, hvis du altså skal bruge det til noget. Kunne f.eks. bruges hvis du har nogle tabeller der er relateret til hinanden.
Avatar billede arne_v Ekspert
24. juni 2005 - 16:33 #8
det kan du ikke

men du kan udføre dem i samme transaktion, hvilket må være lige så godt
Avatar billede thomasabcd Nybegynder
25. juni 2005 - 15:48 #9
Jeg fandt selv ud af det. Det lykkedes med følgende query:

INSERT INTO Appointments (AppointmentHandle, AppointmentName)
VALUES (@AppointmentName + '-' + CAST(IDENT_CURRENT('Appointments')                      AS varchar(30)),@AppointmentName)
Avatar billede arne_v Ekspert
25. juni 2005 - 16:07 #10
hvad kan du bruge en identity created af en anden bruger til ??
Avatar billede thomasabcd Nybegynder
29. juni 2005 - 09:37 #11
Såvidt jeg kan se, får jeg tildelt et unikt nummer til mit handle, så det er fint for mig. Jeg har dog stadig ikke forstået hvorfor @@IDENTITY ikke virker (returnerer NULL, men at IDENT_CURRENT('Appointments') gør, når det er samme tabel, jeg bruger  ?
Avatar billede arne_v Ekspert
04. juli 2005 - 19:46 #12
IDENT_CURRENT('Appointments')

returnerer bare et fra en tidligere INSERT evt. lavet af en helt anden bruger
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
Kategori
Computerworld tilbyder specialiserede kurser i database-management

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