Avatar billede kviller Novice
24. juli 2008 - 23:00 Der er 9 kommentarer og
1 løsning

Hvordan indsætter man flere rows ad gangen?

Jeg kender MySql og der ville jeg gøre sådan:

INSERT INTO [user_arts]
          ([UserID]
          ,[ArtID]
    VALUES
          (<UserID>,<ArtID>)
          (<UserID>,<ArtID>)
          (<UserID>,<ArtID>);
Avatar billede arne_v Ekspert
24. juli 2008 - 23:02 #1
Det gør du ikke.

:-)

Lav flere INSERT sætninger, men bundt dem i en enkelt transaktion.
Avatar billede kviller Novice
24. juli 2008 - 23:03 #2
Jeg frygtede jeg ville få det svar :)

Smider du lige et svar?
Avatar billede arne_v Ekspert
24. juli 2008 - 23:33 #3
Hvis du skal have skovlet store data mængder ind kan du kigge på bulkcopy.
Avatar billede arne_v Ekspert
24. juli 2008 - 23:33 #4
svar
Avatar billede coderdk Praktikant
25. juli 2008 - 00:17 #5
Alternativt:

INSERT INTO [user_arts]
  ([UserID], [ArtID])
VALUES
  select <UserID>, <ArtID>
UNION ALL
  select <UserID>, <ArtID>
UNION ALL
  select <UserID>, <ArtID>
Avatar billede aaberg Nybegynder
25. juli 2008 - 09:02 #6
Som coderdk skriver, så kan du sagtens inserte flere rows ad gangen ved at bruge union all. Der er dog en begrænsning på hvor mange union all man kan have i en sql sætning, jeg er ikke sikker, men jeg mener at huske at den er på 256.

Skal du f.eks. sætte 1000 rækker ind i en tabel, spare man meget ved at køre 5 queries som indsætter 200 rækker ad gangen, end hvis du køre 1000 queries som indsætter 1 række, også selvom de køre i samme transaktion.

Skal du flytte da fra filer ind i en database, kan du eventuelt se på BULK INSERT kommandoen
http://msdn.microsoft.com/en-us/library/ms188365.aspx
Avatar billede kviller Novice
25. juli 2008 - 18:56 #7
Det hele var egentlig fordi jeg lavede en bommert. Jeg kom til at køre en delete query hvor WHERE ikke blev sendt med over. Jeg havde så heldigvis tabellen åben og kunne kopiere data som ren tekst. Det var over 17.000 rows jeg fik slettet :(
Avatar billede aaberg Nybegynder
25. juli 2008 - 20:13 #8
Doh ! :-)

Husk, at du med Sql Serveren kan restore databasen til et ethvert tidspunkt! Alle transaktioner bliver gemt i transaktionsloggen, og dette kan bruges til at "undo" sådanne fejl.
Avatar billede arne_v Ekspert
26. juli 2008 - 04:35 #9
Nu inden folk går helt amok med at "optimere" deres INSERT's med UNION ALL.

2005
indsæt 100000 rækker med 4 felter (INTEGER, DECIMAL, VARCHAR, VARCHAR)

normal (100000 INSERT i 100000 transaktioner) - 43 sekunder
bundtet (100000 INSERT i 400 transaktioner) - 22 sekunder
union all tricket (400 INSERT i 400 transaktioner) - 128 sekunder

Det virker ikke som en "optimering" !
Avatar billede aaberg Nybegynder
29. juli 2008 - 13:48 #10
Jeg troede ikke helt på Arne_V, så jeg gjorde samme test. Og han har ret, union selects har ekstremt dårlig performance i SQL server.

Jeg har dog tidligere gjort samme test i oracle, firebird og SQLite, og der giver det mange gange bedre performance at bruge union tricket. Men ikke Sql Serveren.
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