Avatar billede badal Nybegynder
11. februar 2005 - 11:06 Der er 9 kommentarer og
1 løsning

Stored Procedure

Kan man lave en stored procedure der tjekker om en række findes i db. Hvis den findes så opdateres den og hvis den ikke findes oprettes den.

feks.
if(række findes)
{
opdatere
}
else
{
indsæt
}
Avatar billede dsj Nybegynder
11. februar 2005 - 11:18 #1
IF (EXISTS (SELECT id FROM <table> WHERE ...) )
BEGIN
    UPDATE....
END
ELSE
BEGIN
    INSERT INTO...
END
Avatar billede dsj Nybegynder
11. februar 2005 - 11:20 #2
Man kunne også vælge varianten der altid kører en update først, og hvis ikke nogen rækker er blevet opdateret, afvikles INSERT.

UPDATE...

IF (@@ROWCOUNT = 0)
BEGIN
    INSERT INTO...
END
Avatar billede badal Nybegynder
11. februar 2005 - 11:48 #3
takker ... kunne godt lide løsningsmodel 2.
Avatar billede dsj Nybegynder
11. februar 2005 - 11:52 #4
Man kan stille spørgsmålstegn for hvilken af de to modeller der er hurtigst.

Den første vil altid afvikle to statements: en select og en update, eller en select og en insert.

Den anden vil kun afvikle ét statement, hvis række findes i forvejen, og to hvis ikke den gør. Ulempen kan være, hvis SQL Serveren går ind og låser nogle ressourcer idet update'n afvikles. Hvis den gør det, er den anden model potentielt mere ressourcekrævende end den første.
Avatar billede lorentsnv Nybegynder
11. februar 2005 - 12:00 #5
Vær obs på at der ved store datamængder vil være meget langsomt hvis I bruger cursors til at løbe igennem hver enkelt record.
Det kan betale sig at f.eks. med en temporær hjælpetabel holde styr på de records der skal opdateres, og derefter linke sig til denne hjælpetabel ved én Update sætnign og én insert sætning.
Nekeltvis behandling af records ved hjælp af cursors tager oftest mange ganger så langt tid som bulk behandling af store mængder data.
Avatar billede badal Nybegynder
11. februar 2005 - 12:37 #6
lorentsny ... nu kommer jeg lidt i tvivl for det drejer sig om et par hundrer rækker hvergang der skal opdateres/indsættes. Så rent performance mæssigt skal jo bruge en hjælpe tabel. Men hvordan skal dette gøres?

jeg har en tabel med 3 kollonner:
ID
A
B

1. jeg henter alle elementer der har ID = 10 .. det kan dreje sig om feks 50 rækker.
2. Indsætter dem i hjælpe tabel.

Hvad gør jeg så herefter??
Avatar billede janus_007 Nybegynder
11. februar 2005 - 13:03 #7
Det lyder lidt som om du ikke har et specielt godt design, hvis du skal lave sådan lidt tvivlsomme transactioner. Hvad er det du gerne vil opnå og i hvilken sammenhæng?
Avatar billede badal Nybegynder
11. februar 2005 - 13:20 #8
Det er faktisk en enkelt tabel det drejer sig om. Tabellen benyttes til at registere "Deltager til arrangement". Det vil sige at de tre kolloner i tabellen svarer til:
ID  = brugeren ID
A = Mødenavn
B = Ja/nej

Hvis der antages 10 møder en person allerede skal opdateres,
og 5 nye møder der skal indsættes i databasen. tallene 10 og 5 er bare eksempler i praksis vil det nok dreje sig om større tal.
Det er en forsimplet forklaring men håber at det giver mening.
Avatar billede lorentsnv Nybegynder
11. februar 2005 - 13:34 #9
Hvis det kun drejser sig om 250 rækker, tror jeg ikke du skal være bekymret for performance ved at bruge cursors. Behovet er større ved 10.000+ rækker.
Hvis du har en hjælpetabel, kunne du lave en insert af ID i hjælpetabelle på alle rækker som du skal lave insert/update på. Derefter kan du ved at lave en join mellem hjælpetabel og din target tabel, opdatere alle rækker i hjælpetabellen, der eksisterer fra før i targettabellen, med en markering, således at du nu har en tabel hvor du ved hvilke records der skal opdateres, og dermed også hvilke rækker der skal insertes.
Så joiner du din hjælpetabel med din source tabel, og laver update på alle rækker der findes, og derefter laver du én insert på alle nye rækker.

Du kna også klare noget tilsvarende uden hjælpetabel ved at bruge EXISTS, en så skal du joine source-tabellen med target tabel to gange, og hvis du har en rigtig stor target tabel, kan denne opertaion være mere krævende end at bruge en hjælpetabel.
Avatar billede lorentsnv Nybegynder
11. februar 2005 - 13:36 #10
Løsningen som jeg har beskrevet ovenfor er nok ikke nødvendig før du kommer op i source/target tabeller på over 1. mill records.
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