WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   MS SQL: Fylla databas med mkt data snabbt (https://www.wn.se/forum/showthread.php?t=29185)

Madde 2008-05-09 12:12

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??

Westman 2008-05-09 13:53

Import?

goose 2008-05-09 14:07

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?

Weaver 2008-05-09 14:21

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

tartareandesire 2008-05-09 14:40

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...

Madde 2008-05-10 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..

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...



http://i239.photobucket.com/albums/f...de/databas.gif

martine 2008-05-10 01:51

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.)

goose 2008-05-10 02:13

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.

digiArt 2008-05-10 07:02

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

Magnus_A 2008-05-10 11:52

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!


Alla tider är GMT +2. Klockan är nu 19:11.

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