Avatar billede hugopedersen Nybegynder
04. marts 2002 - 14:19 Der er 13 kommentarer og
1 løsning

Opdatering af records

Jeg har 2 tabeller på en SQL 2000 der er næsten identiske - tabel_1 har 3 felter mere end tabel_2
Nu vil jeg så gerne opdatere alle records i tabel_1 hvor feltet ORDNO er ens i begge tabeller. Jeg skal opdatere alle felter i tabel_1 bortset fra de 3 ekstra.
Jeg vil selvfølgelig gøre det med en stored procedure, men jeg vil gerne vide hvordan.

( ORDNO er ikke mit valg til feltnavn! det stammer fra vores MAPICS system )
Avatar billede proaccess Nybegynder
04. marts 2002 - 15:18 #1
UPDATE Tabel_1 INNER JOIN Tabel_2 ON Tabel_1.ORDNO = Tabel_2.ORDNO SET Tabel_1.feltNavn1 = Tabel_2.feltNavn1, Tabel_1.feltNavn2 = Tabel_2.feltNavn;

Du bliver vist nødt til at angive alle feltnavne specifikt (undtagen de 3 ekstra)
Avatar billede hugopedersen Nybegynder
05. marts 2002 - 07:16 #2
Jeg har lavet følgende

    UPDATE Ordreliste_Til_Linie INNER JOIN Ordreliste_Til_Linie_Temp ON Ordreliste_Til_Linie.ORDNO = Ordreliste_Til_Linie_Temp.ORDNO
   
    SET
   
    Ordreliste_Til_Linie.OSTAT = Ordreliste_Til_Linie_Temp.OSTAT,
    Ordreliste_Til_Linie.OPSTC = Ordreliste_Til_Linie_Temp.OPSTC,
    Ordreliste_Til_Linie.ORDNO = Ordreliste_Til_Linie_Temp.ORDNO,
    Ordreliste_Til_Linie.TOOLS = Ordreliste_Til_Linie_Temp.TOOLS,
    Ordreliste_Til_Linie.OPSEQ = Ordreliste_Til_Linie_Temp.OPSEQ,
    Ordreliste_Til_Linie.OPDSC = Ordreliste_Til_Linie_Temp.OPDSC,
    Ordreliste_Til_Linie.FITEM = Ordreliste_Til_Linie_Temp.FITEM,
    Ordreliste_Til_Linie.FDESC = Ordreliste_Til_Linie_Temp.FDESC,
    Ordreliste_Til_Linie.SSTDT = Ordreliste_Til_Linie_Temp.SSTDT,
    Ordreliste_Til_Linie.ARRDT = Ordreliste_Til_Linie_Temp.ARRDT,
    Ordreliste_Til_Linie.MSNDD = Ordreliste_Til_Linie_Temp.MSNDD,
    Ordreliste_Til_Linie.TQCTD = Ordreliste_Til_Linie_Temp.TQCTD,
    Ordreliste_Til_Linie.ORQTY = Ordreliste_Til_Linie_Temp.ORQTY,
    Ordreliste_Til_Linie.QTDEV = Ordreliste_Til_Linie_Temp.QTDEV,
    Ordreliste_Til_Linie.ODUDT = Ordreliste_Til_Linie_Temp.ODUDT,
    Ordreliste_Til_Linie.ACOTM = Ordreliste_Til_Linie_Temp.ACOTM,
    Ordreliste_Til_Linie.MPROR = Ordreliste_Til_Linie_Temp.MPROR,
    Ordreliste_Til_Linie.TBCDE = Ordreliste_Til_Linie_Temp.TBCDE;
    Ordreliste_Til_Linie.SCODT = Ordreliste_Til_Linie_Temp.SCODT;
    Ordreliste_Til_Linie.UU40MX = Ordreliste_Til_Linie_Temp.UU40MX;
    Ordreliste_Til_Linie.UUQ1MX = Ordreliste_Til_Linie_Temp.UUQ1MX;

Det resulterer i en fejl der hedder 'incorrect syntax near the keyword INNER'
Avatar billede proaccess Nybegynder
05. marts 2002 - 07:36 #3
Så prøver vi at lave join'et på en anden måde...

    UPDATE Ordreliste_Til_Linie, Ordreliste_Til_Linie_Temp
   
    SET
   
    Ordreliste_Til_Linie.OSTAT = Ordreliste_Til_Linie_Temp.OSTAT,
    Ordreliste_Til_Linie.OPSTC = Ordreliste_Til_Linie_Temp.OPSTC,
    Ordreliste_Til_Linie.ORDNO = Ordreliste_Til_Linie_Temp.ORDNO,
    Ordreliste_Til_Linie.TOOLS = Ordreliste_Til_Linie_Temp.TOOLS,
    Ordreliste_Til_Linie.OPSEQ = Ordreliste_Til_Linie_Temp.OPSEQ,
    Ordreliste_Til_Linie.OPDSC = Ordreliste_Til_Linie_Temp.OPDSC,
    Ordreliste_Til_Linie.FITEM = Ordreliste_Til_Linie_Temp.FITEM,
    Ordreliste_Til_Linie.FDESC = Ordreliste_Til_Linie_Temp.FDESC,
    Ordreliste_Til_Linie.SSTDT = Ordreliste_Til_Linie_Temp.SSTDT,
    Ordreliste_Til_Linie.ARRDT = Ordreliste_Til_Linie_Temp.ARRDT,
    Ordreliste_Til_Linie.MSNDD = Ordreliste_Til_Linie_Temp.MSNDD,
    Ordreliste_Til_Linie.TQCTD = Ordreliste_Til_Linie_Temp.TQCTD,
    Ordreliste_Til_Linie.ORQTY = Ordreliste_Til_Linie_Temp.ORQTY,
    Ordreliste_Til_Linie.QTDEV = Ordreliste_Til_Linie_Temp.QTDEV,
    Ordreliste_Til_Linie.ODUDT = Ordreliste_Til_Linie_Temp.ODUDT,
    Ordreliste_Til_Linie.ACOTM = Ordreliste_Til_Linie_Temp.ACOTM,
    Ordreliste_Til_Linie.MPROR = Ordreliste_Til_Linie_Temp.MPROR,
    Ordreliste_Til_Linie.TBCDE = Ordreliste_Til_Linie_Temp.TBCDE,
    Ordreliste_Til_Linie.SCODT = Ordreliste_Til_Linie_Temp.SCODT,
    Ordreliste_Til_Linie.UU40MX = Ordreliste_Til_Linie_Temp.UU40MX,
    Ordreliste_Til_Linie.UUQ1MX = Ordreliste_Til_Linie_Temp.UUQ1MX WHERE Ordreliste_Til_Linie.ORDNO = Ordreliste_Til_Linie_Temp.ORDNO;

BEMÆRK desuden at jeg har erstattet et par ;'er med ,'er...
Avatar billede proaccess Nybegynder
05. marts 2002 - 07:37 #4
Det er IKKE afprøvet specifikt på MS SQL, men er taget ud fra alm. SQL-syntax...
Avatar billede hugopedersen Nybegynder
05. marts 2002 - 07:45 #5
Det resulterer i en fejl ved kommaet i linien
UPDATE Ordreliste_Til_Linie, Ordreliste_Til_Linie_Temp
Avatar billede proaccess Nybegynder
05. marts 2002 - 08:09 #6
Du får lige et vildt gæt mere at lege med:

    UPDATE Ordreliste_Til_Linie
    SET
    Ordreliste_Til_Linie.OSTAT = Ordreliste_Til_Linie_Temp.OSTAT,
    Ordreliste_Til_Linie.OPSTC = Ordreliste_Til_Linie_Temp.OPSTC,
    Ordreliste_Til_Linie.ORDNO = Ordreliste_Til_Linie_Temp.ORDNO,
    Ordreliste_Til_Linie.TOOLS = Ordreliste_Til_Linie_Temp.TOOLS,
    Ordreliste_Til_Linie.OPSEQ = Ordreliste_Til_Linie_Temp.OPSEQ,
    Ordreliste_Til_Linie.OPDSC = Ordreliste_Til_Linie_Temp.OPDSC,
    Ordreliste_Til_Linie.FITEM = Ordreliste_Til_Linie_Temp.FITEM,
    Ordreliste_Til_Linie.FDESC = Ordreliste_Til_Linie_Temp.FDESC,
    Ordreliste_Til_Linie.SSTDT = Ordreliste_Til_Linie_Temp.SSTDT,
    Ordreliste_Til_Linie.ARRDT = Ordreliste_Til_Linie_Temp.ARRDT,
    Ordreliste_Til_Linie.MSNDD = Ordreliste_Til_Linie_Temp.MSNDD,
    Ordreliste_Til_Linie.TQCTD = Ordreliste_Til_Linie_Temp.TQCTD,
    Ordreliste_Til_Linie.ORQTY = Ordreliste_Til_Linie_Temp.ORQTY,
    Ordreliste_Til_Linie.QTDEV = Ordreliste_Til_Linie_Temp.QTDEV,
    Ordreliste_Til_Linie.ODUDT = Ordreliste_Til_Linie_Temp.ODUDT,
    Ordreliste_Til_Linie.ACOTM = Ordreliste_Til_Linie_Temp.ACOTM,
    Ordreliste_Til_Linie.MPROR = Ordreliste_Til_Linie_Temp.MPROR,
    Ordreliste_Til_Linie.TBCDE = Ordreliste_Til_Linie_Temp.TBCDE,
    Ordreliste_Til_Linie.SCODT = Ordreliste_Til_Linie_Temp.SCODT,
    Ordreliste_Til_Linie.UU40MX = Ordreliste_Til_Linie_Temp.UU40MX,
    Ordreliste_Til_Linie.UUQ1MX = Ordreliste_Til_Linie_Temp.UUQ1MX
    FROM Ordreliste_Til_Linie INNER JOIN Ordreliste_Til_Linie_Temp ON Ordreliste_Til_Linie.ORDNO = Ordreliste_Til_Linie_Temp.ORDNO;
Avatar billede terry Ekspert
05. marts 2002 - 08:48 #7
Hi proaccess>will take a look just a soon as I find a hole:o)
Avatar billede proaccess Nybegynder
05. marts 2002 - 08:49 #8
thx... It seems I'm stuck on this one...
Avatar billede terry Ekspert
05. marts 2002 - 08:52 #9
Well if you cant solve it, then dont think I can :o)
Avatar billede proaccess Nybegynder
05. marts 2002 - 08:57 #10
I don't have access to SQL Server, You have !!! - The problem lies in the prober syntax for the UPDATE-command...

UPDATE <modified_table>
SET col1 = <new_value>[, col2 = <new_value>...]
[FROM <modified_table> <join_type>
JOIN <another_table>
  ON <join_condition>]
[WHERE <search_condition>]

Snatched from http://www.tsqlsolutions.com/Articles/Index.cfm?ArticleID=8808&pg=3
Avatar billede hugopedersen Nybegynder
05. marts 2002 - 09:18 #11
Den sidste løsning fungerer som jeg gerne vil have den til.

Jeg vil gerne fortælle baggrunden for problemet, måske er der en anden løsning.

Vi har tidligere hentet nogle produktionsdata fra vores AS/400 til en Access db hvor jeg ikke kan slette eksisterende records i destinationstabellen. Det har jeg så løst ved først at køre en query der tilføjer evt. nye records og derefter en anden der opdaterer eksisterende. Ingen problemer i det.
Nu er vi så nået dertil at applikationsdatabasen skal flyttes til SQL og det giver nogle problemer.  Jeg kan bla. ikke få lov til at opdatere SQL tabellerne via ODBC når inputtabellen er en anden ODBC tabel på AS/400 - løsning blev først at kopiere fra AS/400 til temp Access tabel i min overførselsapplikation og derefter til SQL. Men opdateringen af SQL tabellen kan jeg bare ikke få lov til at køre på nogen som helst måde ved hjælp af en Access query - den påstår at det ikke er et opdaterbart recordset!
Jeg er så kommet frem til at jeg laver en stored procedure som jeg så sætter SQL serveren til at fyre af en gang imellem.

Det er absolut ikke en løsning jeg er stolt af, men hvad skal man gøre når der står 10 mand på nakken af en og venter på data :-)

Måske kan version 2.0 af overførselsapplikationen blive optimeret :-)
Avatar billede terry Ekspert
06. marts 2002 - 11:15 #12
proaccess>sorry for not geting back sooner! Is this question "closed" now?
Avatar billede proaccess Nybegynder
06. marts 2002 - 11:18 #13
Yes, I think hugopedersen got an answer, that he could use... I sertanly got my pts. ;-)
Avatar billede terry Ekspert
06. marts 2002 - 11:29 #14
:o)
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