Avatar billede sdo Nybegynder
22. april 2002 - 13:52 Der er 10 kommentarer og
1 løsning

UPDATE/INSERT på stor tabel uden brug af cursor

Jeg har indlæst døgnets fakturalinier i en Tmp-tabel i en DTS pakke.
På grundlag af indholdet i tmp, skal updates/inserts foretages i min faklin-tabel ud fra feltet type i Tmp-tabel(1=ins,2=upd,4=del)
Jeg kan JOINe Tmp og Faklin-tabel på fakdato,faknr,selskab
Det er fristende med en Declare Cursor/while @@fetch_status=0 osv., men det er uhyre ressourcekrævende (der 10mill recs i min Faklin-tabel)

Nogen, der kan hjælpe med en bedre/alternativ måde at kode dette klassiske problem på?
 
Avatar billede bennytordrup Nybegynder
22. april 2002 - 13:58 #1
insert faklin (...)
select ...
from tmp
where tmp.Type = 1

update faklin
set ...
from faklin F inner join tmp T on ...
where  T.Type = 2
Avatar billede terry Ekspert
22. april 2002 - 13:59 #2
If you are using DTS then what is the problem? Yoou already have the information in the tmp file to do this. You use an Execut SQL tesk to carry out thee SQL's

1  = Delete
2 = Insert
3 = Update
Avatar billede slash Nybegynder
22. april 2002 - 14:11 #3
Du kan jo bruge en ganske normal WHILE løkke!
Avatar billede terry Ekspert
22. april 2002 - 14:46 #4
sdo> If you are already using DTS to make your temp table and as you mention have alreday decided IF each record is (1=ins,2=upd,4=del) then WHY dont you just carry out the appropriate operation instead of making a temp table?
Avatar billede terry Ekspert
23. april 2002 - 20:25 #5
sdo do you still need help here?
Avatar billede sdo Nybegynder
24. april 2002 - 08:31 #6
Terry - no thank You. I am still working on the problem, but it may seem too complex for me to describe properly for You at this moment.
Thank You for Your support.
Avatar billede dargny Nybegynder
24. april 2002 - 13:57 #7
Forstil jer at I skal opdatere tabel A udfra tabel B. B ligger ikke i tidsmæssig korrekt rækkefølge. B indeholder (Tid, type(1=insert,2=update,3=delete), variable(x))

Der findes 4 rækker i tabel(B)
1501,1,x1
1504,1,x1
1502,2,x1
1503,3,x1

Hvis de udføres i denne ovenstående rækkefølge vil x1 blive slette i A da den sidste linie er en type 3 - Delete

Hvis de udføres i tidsmæssig korrekt rækkefølge vil x1 blive oprettet igen(1504) efter at den er blevet slettet af den foregående linie(1503).

Hvordan laver SDO en SQL kald uden Cursor som kan læse ovenstående tabel korrekt ind?

Jeg tror at det er sådan SDO, mener spørgsmålet.
Avatar billede sdo Nybegynder
24. april 2002 - 14:02 #8
Tak, det var sådan en god beskrivelse af kernen i mit problem. Håber, det kan inspirere frem mod et løsningsforslag......
Avatar billede terry Ekspert
25. april 2002 - 22:07 #9
sdo How much do you know to DTS? In this example you can NOT with a single SQL do all three operations. Therefore I suggest that you take a look at DTS and open a recordset on the temp table looping through each record and then carrying out either a insert update or delete.

Now I dont know much about "fakutura" but I am sure that before you can either delet or update then it has to exist (INSERT)
and I am sure that once it is INSERTed it can be deleted and once it is DELETEd it can NOT get INSERTed again. So if that is correct then I would think that this sequence would work, and it can be done in DTS.

(this is NOT SQL)
INSERT INTO A FROM B and type = 1
UPDATE A WHERE A.Key = B.key and type = 2
DELETE FROM A WHERE EXISTS B and type=3
Avatar billede sdo Nybegynder
29. april 2002 - 08:55 #10
Thank You - I have already solved the problem in a similar way.
100 in the bank for You, Terry
Avatar billede terry Ekspert
29. april 2002 - 09:01 #11
thanks :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