Avatar billede TV47 Seniormester
02. august 2019 - 23:13 Der er 9 kommentarer og
1 løsning

Gennemløb af SQL tabel og gemme data i anden tabel

Hej.

Jeg ønsker at gennemløbe records i tabel 1 og skrive tilsvarende records i tabel 2, dog kun med overførsel af værdierne på nogle af  felterne.

De to tabeller findes i samme database.

Hvordan skal den kode cirka se ud.

OBS: Jeg skal desuden have slettet alle records i den førstnævnte tabel, når værdier er kopieret over i den anden tabel.

Nogen der kan hjælpe?
Avatar billede Slettet bruger
03. august 2019 - 10:15 #1
du skal lave en DO WHILE loop, der kører sålænge der er poster i tabel 1
så skal du gemme de data du vil i variabler.
så det bliver noget med
$data=select * from tabel1 where felt=200
når alt er gemt, og do while rammer slutningen af tabel1, skal variablerne skrives tilbage til tabel2
$data2=insert into tabel2

dette er det grundlæggende
https://www.plus2net.com/asp-tutorial/sql-display.php
Avatar billede Slettet bruger
03. august 2019 - 10:40 #2
#1 lær do while loop
https://www.tutorialspoint.com/vba/vba_do_while_loop

#2 lær hent/gem kommando i SQL (select where)
https://www.w3schools.com/sql/sql_where.asp  ;hent

https://www.w3schools.com/sql/sql_insert_into_select.asp
her skriver den nogle felter som er hentet et andet sted fra
Avatar billede Slettet bruger
03. august 2019 - 10:45 #3
dette er tæt på hvad du søger

DO WHILE NOT rs.EOF
  INSERT INTO table2 (column1, column2, column3, ...)
  SELECT column1, column2, column3, ...
  FROM table1
  WHERE condition;
  rs.MoveNext
LOOP
Avatar billede softspot Forsker
03. august 2019 - 11:40 #4
Sidwave har fat i noget af det rigtige, men du behøver nok kun at lave et SQL-kald for at overføre alle værdierne fra den ene til den anden tabel.

INSERT INTO tabel2(felt1,felt2,felt3)
SELECT feltA, feltB, feltC
FROM tabel1

Er der betingelser for hvilke rækker du vil overføre, kan du blot tilføje en WHERE (som Sidwave også illustrerer).
Avatar billede TV47 Seniormester
03. august 2019 - 12:33 #5
Jeg har fået lavet nedenstående, hvor det faktisk virker, dog bortset fra at jeg ikke sletter posteringer i source-tabellen endnu.

Men jeg synes ikke det er optimalt, hvordan det er lavet, når man skal køre Select af flere omgange.

Jeg har egentlig brug for at kunne tage hver enkelt record for sig og gøre de ting ved den som er nødvendigt. Måske med noget While Do eller IF Then. Kan nogen hjælpe mig med hvordan min kode skal se ud?


protected void BogførPoster(object sender, EventArgs e)
        {
            using (SqlConnection SqlCon = new SqlConnection(connectionString))
            {
                SqlCon.Open();

                String query = "INSERT INTO LedTrans (Bilag, Dato, Konto, Beløb, Momskode, MomsBeløb, Tekst) " +
                    "SELECT Bilag, Dato, Konto, Beløb*.8, Momskode, Beløb*.2, Tekst FROM Kladdeliste WHERE Momskode='I25'";
                SqlCommand sqlCmd = new SqlCommand(query, SqlCon);
                sqlCmd.ExecuteNonQuery();

                String query2 = "INSERT INTO LedTrans (Bilag, Dato, Konto, Beløb, Momskode, MomsBeløb, Tekst) " +
                    "SELECT Bilag, Dato, Konto, Beløb, Momskode, NULL, Tekst FROM Kladdeliste WHERE Momskode=''";
                SqlCommand sqlCmd2 = new SqlCommand(query2, SqlCon);
                sqlCmd2.ExecuteNonQuery();

                String query3 = "INSERT INTO LedTrans (Bilag, Dato, Konto, Beløb, Momskode, MomsBeløb, Tekst) " +
                    "SELECT Bilag, Dato, ModKonto, Beløb*-1, '', NULL, Tekst FROM Kladdeliste";
                SqlCommand sqlCmd3 = new SqlCommand(query3, SqlCon);
                sqlCmd3.ExecuteNonQuery();
            }                             
        }
Avatar billede softspot Forsker
03. august 2019 - 12:51 #6
Du kan godt lave multistatements og så bare køre dem alle med et kald. Altså i formatet vist herunder.

INSERT INTO table2 (...) SELECT ... FROM table1 WHERE ...clause1...;
INSERT INTO table2 (...) SELECT ... FROM table1 WHERE ...clause2...;
INSERT INTO table2 (...) SELECT ... FROM table1 WHERE ...clause3...;
Avatar billede TV47 Seniormester
03. august 2019 - 13:17 #7
Jeg ved ikke helt om det rækker til det behov jeg har, men hvordan skulle min kode ovenfor så indrettes?
Avatar billede softspot Forsker
03. august 2019 - 15:34 #8
Hvis det du vil er illustreret i din egen kode fra #5, så er det mere optimalt, at du laver een streng med alle tre SQL-sætninger (hver sætning adskilt af semikolon) og kalder ExecuteNonQuery på samme måde som har gjorde i dit eget eksempel.

Hvis din kode ikke illustrerer dit formål, kunne det være en idé, at du beskrev, hvad du rent faktisk gerne ville have løst... :-)
Avatar billede TV47 Seniormester
03. august 2019 - 16:11 #9
Takker.
Avatar billede softspot Forsker
03. august 2019 - 16:41 #10
Du kan naturligvis også smide din delete ind i slutningen af samme SQL-streng.

Du burde nok også lægge det hele i en transaktion, så du ikke kommer til at slette rækker du ikke har behandlet endnu...

Du kan nok inkludere transaktionen i din SQL-streng (BEGIN TRAN før og COMMIT TRAN efter). Alternativt kan du anvende ADO.NET objektet TransactionScope. Se forklaringen til dette her: https://docs.microsoft.com/en-us/dotnet/api/system.transactions.transactionscope?redirectedfrom=MSDN&view=netframework-4.8
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

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