Kom ihåg mig?
Home Menu

Menu


MS SQL: Fylla databas med mkt data snabbt

 
Ämnesverktyg Visningsalternativ
Oläst 2008-05-09, 12:12 #1
Maddes avatar
Madde Madde är inte uppkopplad
Nykomling
 
Reg.datum: May 2007
Inlägg: 8
Madde Madde är inte uppkopplad
Nykomling
Maddes avatar
 
Reg.datum: May 2007
Inlägg: 8
Hej

Jag har en massa data som jag ska lägga in i en sql server databas.
Finns det något bra sätt så att man slipper lägga in en rad i taget.

Jag lägger in den i designvy genom sql server men kan också genom INSERT utryck lägga in men bara en åt gången...

gäller sql 2005

tips??
Madde är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-05-09, 13:53 #2
Westmans avatar
Westman Westman är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jun 2004
Inlägg: 4 021
Westman Westman är inte uppkopplad
Klarade millennium-buggen
Westmans avatar
 
Reg.datum: Jun 2004
Inlägg: 4 021
Import?
Westman är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-05-09, 14:07 #3
gooses avatar
goose goose är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2007
Inlägg: 451
goose goose är inte uppkopplad
Flitig postare
gooses avatar
 
Reg.datum: Jun 2007
Inlägg: 451
det finns en del sätt, frågan är bara vart din källdata kommer ifrån, tabseparerad fil, excel, annan databas, annan tabell i samma databas etc?
goose är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-05-09, 14:21 #4
Weaver Weaver är inte uppkopplad
Flitig postare
 
Reg.datum: Aug 2006
Inlägg: 403
Weaver Weaver är inte uppkopplad
Flitig postare
 
Reg.datum: Aug 2006
Inlägg: 403
Nu kommer jag från MySQL sidan av SQL men det kanske kan hjälpa dig endå.

När jag ska lägga in mycket data åt gången så brukar jag använda detta SQL uttrycket:
INSERT INTO `tabell` (`key`, `value`) VALUES (`key1`, `value1`),(`key2`, `value2`),...,...;

Innan du kör detta uttrycket så kan du låsa tabellen, tabell, genom att köra:
LOCK TABLE `tabell` WRITE

Sedan kan du också passa på att avaktivera indexering medans du kör importen:
ALTER TABLE `tabell` DISABLE KEYS

Så formulan är alltså:
LOCK TABLE `tabell`
ALTER TABLE `tabell` DISABLE KEYS
INSERT INTO `tabell` (`key`, `value`) VALUES (`key1`, `value1`),(`key2`, `value2`),...,...;
UNLOCK TABLE `tabell`
ALTER TABLE `tabell` ENABLE KEYS

Den sista queryn kommer att ta lite tid om du redan har mycket data i tabellen eftersom hela tabellen måste omindexeras
Weaver är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-05-09, 14:40 #5
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
Som påpekats innan så är det omöjligt att ge ett relevant svar utan att veta vad det är för typ av källa...
__________________
Full-stack developer, free for smaller assignments
tartareandesire är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-05-10, 01:26 #6
Maddes avatar
Madde Madde är inte uppkopplad
Nykomling
 
Reg.datum: May 2007
Inlägg: 8
Madde Madde är inte uppkopplad
Nykomling
Maddes avatar
 
Reg.datum: May 2007
Inlägg: 8
Jag har det listat i ett mail det som skall in.....det är ju flera hundra rader med Namn på fåglar... det jag vill undika är o slippa kopiera en rad i taget o klistra in per rad i databasen utan kopiera allt o pasta in o allt hamnar på egen rad i databasen...gör jag insert måste jag ändå kopiera in allt en efter en..

Jag har 3 kolumer i en tabell med svenska engeka o latinska namn på fåglar...

det är några humdra rader som skall in...



Madde är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-05-10, 01:51 #7
martines avatar
martine martine är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Mar 2005
Inlägg: 767
martine martine är inte uppkopplad
Mycket flitig postare
martines avatar
 
Reg.datum: Mar 2005
Inlägg: 767
Citat:
Originally posted by Madde@May 10 2008, 01:26
Jag har det listat i ett mail det som skall in.....det är ju flera hundra rader med Namn på fåglar... det jag vill undika är o slippa kopiera en rad i taget o klistra in per rad i databasen utan kopiera allt o pasta in o allt hamnar på egen rad i databasen...gör jag insert måste jag ändå kopiera in allt en efter en..
Vad jag skulle göra är att fixa till perl-skript med ett regexp som plockar ut allt ur tabellen och sedan skapar en fil med alla INSERT; efter varandra.

För detta behöver man förstås se exakt hur textfilen i mejlet ser ut och hur databasen är uppbyggd. (Och dessutom ha någon aning om regexp:ar och valfritt skriptspråk...)

(Det här kanske inte hjälper dig direkt men det är ungefär så man brukar göra - det finns säkert någon som här som hjälper dig vidare.)
martine är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-05-10, 02:13 #8
gooses avatar
goose goose är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2007
Inlägg: 451
goose goose är inte uppkopplad
Flitig postare
gooses avatar
 
Reg.datum: Jun 2007
Inlägg: 451
Då ska du använda bcp-verktyget eller kommandot BULK INSERT i query analyzer. Det kan se ut typ såhär:

bcp databasename..tablename in textfile.dat -c -t , -r \n -Sservername -Usa -Ppassword

-t växlen anger vilken fältterminator och -r radterminator. I mitt exempel är fälten avgränsade med ett kommatecken och varje rad med ett enter.

Annars kan du köra BULK INSERT, då ser det ut så här:

BULK INSERT databasename..tablename FROM 'c:\textfile.dat'
WITH (
DATAFILETYPE = 'char',
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)


Hoppas svaret hjälper mer än det stjälper Lycka till!

Edit: Vill bara poängtera att bcp körs som ett program i kommandoprompten och inte i query analyzern, det kanske inte framgick av min text.
goose är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-05-10, 07:02 #9
digiArt digiArt är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Jan 2004
Inlägg: 1 429
digiArt digiArt är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Jan 2004
Inlägg: 1 429
1. Kolla kolumnordningen i den tabell som det ska in i
2. Kopiera ut det från mailet, klistra in i excel
3. Flytta runt kolumnerna i excel så de stämmer med databasen
4. Markera hela dataområdet i excel
5. Ctrl + C
6. Markera hela första raden i tabellen i databasen (klicka på fyrkanten med en pil eller vad det nu är för ikon)
7. Ctrl + V

Det tar lite tid att få in datat på det här sättet, men du slipper hacka script
digiArt är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-05-10, 11:52 #10
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
De flesta SQL-frontends har väl en funktion för att läsa in textfiler.
Bara textfilen är formaterad ordentligt så går det bra.
tänk på:
Rätt teckenkodning.
En rad per rad.
Skiljetecken mellan fälten, till exempel ;
Avgränsa teckenfält med ""
Escapa läskiga tecken med \
Rätt antal fält per rad och i rätt ordning
Kör!
Magnus_A är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 09:58.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017