Avatar billede sblar Nybegynder
03. februar 2003 - 00:21 Der er 12 kommentarer og
1 løsning

Fortsæt INSERT efter Violation of PRIMARY KEY

Sikkert et simpelt problem, men jeg kan ikke se lyset..

I en sp indsætter jeg en masse rækker i en tabel ud fra indholdet af en cursor. Da nogle af rækkerne allerede findes i destinationstabellen, afbrydes proceduren med "Violation of PRIMARY KEY constraint". Derved bliver resten af rækkerne ikke indsat i dest.tabellen. Hvordan undgår jeg dette. Der skal selvfølgelig ikke indsættes dubletter.

DECLARE New_Cursor CURSOR FOR
SELECT * FROM Table1 WHERE Dato >= [en dato]   

OPEN New_Cursor

FETCH NEXT FROM New_Cursor INTO @Felt1,@Felt2,@Felt3

IF @@FETCH_STATUS = 0
    INSERT INTO Table2 VALUES (@Felt1,@Felt2,@Felt3)

WHILE @@FETCH_STATUS = 0 BEGIN
  FETCH NEXT FROM Newdata_Cursor INTO Felt1,@Felt2,@Felt3
  INSERT INTO Table2 VALUES (@Felt1,@Felt2,@Felt3)
END

CLOSE New_Cursor
DEALLOCATE New_Cursor
Avatar billede hugopedersen Nybegynder
03. februar 2003 - 07:41 #1
Jeg har et udklip fra en procedure jeg bruger - måske kan den lede dig på rette spor.

    INSERT INTO tblToolNbrs(fldRegNbr, fldRecycle, fldRecycleText, fldAddDate, fldAddBy)
    SELECT fldRegNbr, fldRecycle, fldRecycleText, fldAddDate, fldAddBy
    FROM tblTempNbrs
    WHERE fldRegNbr NOT IN  (SELECT fldRegNbr FROM tblToolNbrs)
Avatar billede janus_007 Nybegynder
03. februar 2003 - 14:51 #2
Du kan få for 30 point...

hint : Lad være med at bruge primary :O) og....
Avatar billede jepzz Nybegynder
03. februar 2003 - 15:00 #3
Det er vel det sædvanlige, indput validering.
Husk altid at checke om rækken eksisterer i forvejen ellers er der ingen grund til at have en primær nøgle.
Prøv lidt a la det hugopedersen foreslår.
Avatar billede janus_007 Nybegynder
03. februar 2003 - 15:03 #4
Duer ikke set udfra et performance synspunkt!! - Jo hvis du sætter 5 rækker ind om dagen er det fint, men...
Avatar billede jepzz Nybegynder
03. februar 2003 - 15:10 #5
Nu ved jeg ikke hvordan et MS-produkt klarer det, men en Oracle database ville ikke have noget problem med lige først at validere input, også selvom det var flere 100.000 records vi snakker om.
Avatar billede janus_007 Nybegynder
03. februar 2003 - 15:28 #6
jepzz-->> hehe

Det er klart at enhver server bruger ressourcer på validering, også Oracle (måske ikke helt så mange *S*), men der er nu en anden smart måde at klare det på, på en MSSQL :O)
Avatar billede sblar Nybegynder
03. februar 2003 - 17:49 #7
janus 007> Har du en løsning og fisker efter flere points eller hvad? Det kan du da godt få, men skal jeg så oprette et nyt spørgsmål eller hvordan?
Primary er nødvendigt da der absolut ikke må forekomme dubletter (ikke kun i denne forbindelse) og det jeg savner er en mulighed for at MSSQL bare skipper indsætning af dubletter og så ellers fortsætter med de andre poster.
Avatar billede janus_007 Nybegynder
04. februar 2003 - 00:44 #8
syntes bare 30 point er for lidt for et spørgsmål af den kaliber...

btw. inden jeg svarer, hvorfor bruger du en resource krævende cursor når det hele kan laves med en INSERT INTO ??
Avatar billede sblar Nybegynder
04. februar 2003 - 08:07 #9
janus 007> Jeg gav oprindeligt 30 point fordi jeg troede at det var et simpelt spørgsmål som jeg bare ikke kendte svaret på. Du får da bare 100 ekstra ,så'n skal det ikke heller ikke være.
Grunden til at jeg bruger en cursor er at jeg troede at jeg netop kunne undgå dette problem ved at behandle een post ad gangen. Jeg var da helt sikker på at det ville give problemer hvis jeg forsøgte at indsætte hele sættet på een gang.
Og kom så med det svar :o)
Avatar billede janus_007 Nybegynder
04. februar 2003 - 09:37 #10
Jeg ville nok hoppe tilbage til INSERT INTO herefter. Du fravælger primary key i tabeldesign, går ind under 'Manage Indexes' (højreklik på tabellen), vælg den Column som du hidtil havde din primary på. Under Index options vælger du Unique values og Ignore duplicate values!! Det skulle klare sagen, hvis du ikke har behov for noget andet clustered index på andre columns, så sæt flueben i den option ligeledes :O)


Håber du kan bruge det.......
Avatar billede sblar Nybegynder
04. februar 2003 - 18:01 #11
janus 007> Jeg prøver lige om det også fungerer når min primary dækker 5 kolonner. Kan man ikke kun have 1 clustered index?
Jeg tror det her er vejen, med mindre det går helt ad h... til, opretter jeg et nyt spørgsmål med 100 ekstra til dig.
Avatar billede janus_007 Nybegynder
04. februar 2003 - 18:17 #12
Jo der kan kun være et clustered index på en tabel!. Hvis din primary dækker over så mange burde du måske over at nornmaliserer noget mere.

Men hvis det ikke er strengt nødvendigt kan du jo bare lade være med at lave et clustered index :O)  (ingen steder der står at det er en nødvendighed, men bare en god idé)
Avatar billede sblar Nybegynder
04. februar 2003 - 22:45 #13
janus 007> Din idé var rigtig god og den virker..desværre bare ikke for mig! Det jeg forsøger er at indsætte i en tabel på en linked server og i det tilfælde fungerer dette bare ikke :o( Der kommer, som forventet, en "Duplicate key was ignored.", men *ingen* rækker indsættes overhovedet. På en identisk tabel på samme server, fungerer alt som forventet, dubletter springes over og alle andre indsættes.
Dette vil jeg betragte som en bug og skal selvfølgelig ikke gå ud over dig, så jeg opretter et "point til janus 007"- spørgsmål med de 100 point.
Med mindre du også har en løsning på det her og vil 200 point mere (lokke,lokke) tror jeg at jeg starter med at slette dubletterne i destinationstabellen inden jeg forsøger at indsætte dem.
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