Avatar billede karsten_larsen Praktikant
27. juli 2005 - 19:44 Der er 20 kommentarer og
1 løsning

INSERT INTO betinget af anden database

Hvad er den korrekte måde at gøre det på?

Der der oprettes en post i Tabel A, såfremt et bestemt forhold gør sig gældende i Tabel B. I dette tilfælde skal værdi_1 være større end værdi_2.


strSQL = "INSERT INTO Tabel_A (navn)VALUES(demo_navn)"
strSQL = strSQL & "Union "
strSQL = strSQL & "SELECT * FROM Tabel_B WHERE værdi_1 > værdi_2"

Og hvis det ikke kan lade sig gøre, hvordan håndteres så en fejlmeldelse?

??:-) karsten_larsen
Avatar billede nielle Nybegynder
27. juli 2005 - 19:57 #1
SQL1 = "SELECT demo_navn FROM tabel_b WHERE værdi_1 > værdi_2"
rs1 = Conn.Execute(SQL2)

Do While Not rs1.EOF
    SQL2 = "INSERT INTO tabel_a (navn) VALUES ('" & rs1("demo_navn") & ")"
    Conn.Execute(SQL2)

    rs1.MoveNext
Loop
Avatar billede nielle Nybegynder
27. juli 2005 - 19:58 #2
Du kan ikke indsætte en masse rækker via et enkelt SQL-kald - der skal et kald til pr. række.
Avatar billede nielle Nybegynder
27. juli 2005 - 19:59 #3
Der manglede vist lige en ping i denne:

SQL2 = "INSERT INTO tabel_a (navn) VALUES ('" & rs1("demo_navn") & "')"
Avatar billede ksoren Nybegynder
27. juli 2005 - 20:07 #4
strSQL = "INSERT INTO Tabel_A (navn) "
strSQL = strSQL & "SELECT felt FROM Tabel_B WHERE værdi_1 > værdi_2"
Avatar billede karsten_larsen Praktikant
27. juli 2005 - 20:12 #5
Hvis jeg har forstået det rigtigt og fordi data ikke skal hentes fra Tabel_B men fra en Request.Form

SQL1 = "SELECT id FROM tabel_b WHERE værdi_1 > værdi_2"
rs1 = Conn.Execute(SQL1)

Do While Not rs1.EOF
    SQL2 = "INSERT INTO tabel_a (navn) VALUES ('" & Trim(Request.Form("navn")) &  "')"
    Conn.Execute(SQL2)

    rs1.MoveNext
Loop

IF rs1.EOF THEN
    Response.write ("Der kunne ikke oprettes post fordi ...")
END IF


Jeg sad og læste om Transaction, kunne dette også være en løsning

TRANSACTION
    strSQL = "INSERT INTO tabel_a (navn) VALUES ('" & Trim(Request.Form("navn")) &  "')"
    Conn.Execute(strSQL)
Save TRANSACTION ny_post
    strSQL_tjek = "SELECT id FROM tabel_b WHERE værdi_1 > værdi_2"
    Conn.Execute(strSQL_tjek)
    IF @@ERROR <> ROLLBACK TRANSACTION ny_post
COMMIT TRANSACTION


?:-) karsten_larsen
Avatar billede karsten_larsen Praktikant
27. juli 2005 - 20:13 #6
btw bruger mssql
Avatar billede karsten_larsen Praktikant
27. juli 2005 - 20:22 #7
Det bør nok være sådan her?

TRANSACTION
    strSQL = "INSERT INTO tabel_a (navn) VALUES ('" & Trim(Request.Form("navn")) &  "')"
    Conn.Execute(strSQL)
Save TRANSACTION ny_post
    strSQL_tjek = "SELECT id FROM tabel_b WHERE værdi_1 > værdi_2"
    Set rs = Conn.Execute(strSQL_tjek)
    IF rs.EOF then
    ROLLBACK TRANSACTION ny_post
    end if
COMMIT TRANSACTION
Avatar billede nielle Nybegynder
27. juli 2005 - 20:24 #8
Der skal være en forbindelse mellem det du trækker ud fra den ene tabel og det du sætter ind i den anden. Hvad er det f.eks. for et id du vil trække ud af tavbel_b og hvad er relationen til det Request.Form("navn") som du gerne viln indsætte i den anden tabel?

BTW: Konstruktionen:

    ...
    rs1.MoveNext
Loop

IF rs1.EOF THEN
    Response.write ("Der kunne ikke oprettes post fordi ...")
END IF

- vil aldrig virke idet at rs1.EOF vil være sand når den første løkke er færdig. Så heller bytte om:

If rs1.EOF Then
    Response.write ("Der kunne ikke oprettes post fordi ...")
Else
    Do While Not rs1.EOF
        SQL2 = "INSERT INTO tabel_a (navn) VALUES ('" & Trim(Request.Form("navn")) &  "')"
        Conn.Execute(SQL2)

        rs1.MoveNext
    Loop
End If


BTW2. Nej transaction er ikke svaret på dit problem.
Avatar billede karsten_larsen Praktikant
27. juli 2005 - 20:34 #9
Der er ingen relationel forbindelse imellem de to tabeller og der skal ikke indsættes data fra tabel_B i tabel_A.

Såfremt størrelsesforholdet ikke er i orden skal der ikke kunne oprettes post´er i tabel_A.
Avatar billede nielle Nybegynder
27. juli 2005 - 20:40 #10
Skal det forstås sådan at der kun er en eneste række i tabel_b?
Avatar billede nielle Nybegynder
27. juli 2005 - 20:40 #11
... eller måske 0 eller 1 række?
Avatar billede karsten_larsen Praktikant
27. juli 2005 - 20:42 #12
yes - der vil altid kun være en eneste række i tabel_b som bestemmer om der skal oprettes en post i tabel_a
Avatar billede karsten_larsen Praktikant
27. juli 2005 - 20:42 #13
rækken eksisterer altid
Avatar billede nielle Nybegynder
27. juli 2005 - 20:47 #14
SQL1 = "SELECT count(*) AS antal FOM tabel_b WHERE værdi_1 > værdi_2"
rs1 = Conn.Execute(SQL1)

If rs1("antal") = 0 Then
    Response.write ("Der kunne ikke oprettes post fordi ...")
Else
    SQL2 = "INSERT INTO tabel_a (navn) VALUES ('" & Trim(Request.Form("navn")) & "')"
    Conn.Execute(SQL2)
End If
Avatar billede karsten_larsen Praktikant
27. juli 2005 - 20:55 #15
Det ser rigtigt ud.

Er det sikkert nok imod at andre kald ikke kan lave en insert into i det tidsrummet der er mellem Conn.Execute(SQL1) og Conn.Execute(sql2)?
Avatar billede nielle Nybegynder
27. juli 2005 - 20:57 #16
Mener du en UPDATE på tabel_b eller en INSERT INTO i tabel_a?

Og hvorfor er det vigtigt i den konkrete sammenhæng?
Avatar billede karsten_larsen Praktikant
27. juli 2005 - 21:03 #17
Fordi ved insert i tabel_A øges værdi_2 i tabel_B med 1, tabellen fungerer som en tæller.
Avatar billede nielle Nybegynder
27. juli 2005 - 21:17 #18
Ja, så lyder det som om at du skal bruge transactions. Men vist ikke helt på den måde du selv har angivet:

http://www.asp101.com/articles/chris/asptransactions/default.asp
Avatar billede nielle Nybegynder
27. juli 2005 - 21:19 #19
... eller måske sådan her:

http://psacake.com/web/jk.asp
Avatar billede karsten_larsen Praktikant
27. juli 2005 - 21:36 #20
nielle med dit script og lidt transaction fungerer det fint. Vil du lave et svar og mange tak for hjælpen.

:-) karsten_larsen
Avatar billede nielle Nybegynder
27. juli 2005 - 21:40 #21
Svar :^)
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
Kurser inden for grundlæggende programmering

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