2009-05-29 8 views
5

Ho un file csv e devo importarlo in una tabella in sql 2005 o 2008. I nomi delle colonne e il conteggio in csv sono diversi dai nomi delle colonne della tabella e contare. Il csv è diviso da un ';' .Utilizzare bcp per importare file csv in sql 2005 o 2008

Esempio

CSV FileContents:

FirstName;LastName;Country;Age 
Roger;Mouthout;Belgium;55 

SQL persona Tabella

Columns: FName,LName,Country 
+0

Hai guardato bcp.exe? – gbn

+0

Che mondo rende questo file un file CSV (Comma Separated Values)? –

risposta

9

mi piacerebbe creare una tabella temporanea, alla rinfusa inserire il sacco, selezionare nella nuova tabella che cosa è necessario e rilasciare la tabella temporanea.

Qualcosa di simile

CREATE TABLE dbo.TempImport 
(
    FirstName varchar(255), 
    LastName varchar(255), 
    Country varchar(255), 
    Age varchar(255) 
) 
GO 
BULK INSERT dbo.TempImport FROM 'PathToMyTextFile' WITH (FIELDTERMINATOR = ';', ROWTERMINATOR = '\n') 
GO 
INSERT INTO dbo.ExistingTable 
(
    FName, 
    LName, 
    Country 
) 
SELECT FirstName, 
     LastName, 
     Country 
FROM  dbo.TempImport 
GO 
DROP TABLE dbo.TempImport 
GO 
+6

Il titolo della domanda era su come usare lo strumento BCP, non l'inserimento bulk, anche se questa potrebbe essere la risposta giusta per la maggior parte dei casi, l'inserimento bulk presenta alcune limitazioni sul numero di righe e campi che lo strumento bcp non ha. – bpatrao

+0

Sebbene questo sia ovviamente molto tempo fa, in primo luogo, il titolo della domanda potrebbe menzionare bcp ma il contenuto della domanda chiede semplicemente come importarlo e in secondo luogo non ci sono limiti di riga o campo in BULK INSERT che non esistono in BCP afaik –

+0

Ciao Dan ! Se si controlla la documentazione Microsoft ufficiale (http://msdn.microsoft.com/en-us/library/ms188365.aspx) si afferma chiaramente "Quando si utilizza un file di formato con BULK INSERT, è possibile specificare solo fino a 1024 campi. Questo è uguale al numero massimo di colonne consentite in una tabella.Se si utilizza BULK INSERT con un file di dati che contiene più di 1024 campi, BULK INSERT genera l'errore 4822. L'utilità bcp non ha questa limitazione, quindi per i file di dati che contengono più di 1024 campi, usa il comando bcp. ". Capisco che questo è un problema minore, ma solo per tenere tutti informati :) – bpatrao

8

È possibile utilizzare un file di formato durante l'importazione con BCP:

Creare un file di formato per il vostro tabella:

bcp [table_name] format nul -f [format_file_name.fmt] -c -T 



9.0 
4 
1  SQLCHAR  0  100  ","  1  FName    SQL_Latin1_General_CP1_CI_AS 
2  SQLCHAR  0  100  ","  2  LName    SQL_Latin1_General_CP1_CI_AS 
3  SQLCHAR  0  100  ","  3  Country   SQL_Latin1_General_CP1_CI_AS 
4  SQLCHAR  0  100  "\r\n" 0  Age    SQL_Latin1_General_CP1_CI_AS 

Modificare il file di importazione. Il trucco consiste nell'aggiungere una riga fittizia per il campo che si desidera saltare e aggiungere uno 0 0 come ordine della colonna del server.

quindi importare i dati utilizzando questo file di formato, specificando il file di input, questo file formato e il separatore:

bcp [table_name] in [data_file_name] -t , -f [format_file_name.fmt] -T 
3

Io ora preferisco usare i file in formato XML come questo con BULK INSERT o OPENROWSET:

<?xml version="1.0"?> 
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<RECORD> 
    <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="|" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="37"/> 
    <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="41"/> 
    <FIELD ID="4" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="17"/> 
    <FIELD ID="5" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="10" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
</RECORD> 
<ROW> 
    <COLUMN SOURCE="1" NAME="i" xsi:type="SQLCHAR"/> 
    <COLUMN SOURCE="2" NAME="j" xsi:type="SQLUNIQUEID"/> 
    <COLUMN SOURCE="3" NAME="k" xsi:type="SQLNUMERIC" PRECISION="18" SCALE="0"/> 
    <COLUMN SOURCE="4" NAME="l" xsi:type="SQLBINARY"/> 
    <COLUMN SOURCE="5" NAME="m" xsi:type="SQLVARYCHAR"/> 
</ROW> 
</BCPFORMAT> 

quindi è possibile utilizzare il comando BULK INSERT lato server come segue:

BULK INSERT foo FROM '\\mydomain.com\bar\bletch' WITH (FORMATFILE='foo.xml', ERRORFILE='foo.errors', FIRSTROW = 1, BATCHSIZE=10000) 

in alternativa, se si desidera modificare i dati 'in volo', è possibile utilizzare il

INSERT foo(i, j,k) 
SELECT foo_delimited.i, foo_delimited.j, foo_delimited.k * 2 
OPENROWSET(BULK 'foo', 
        FORMATFILE= 'foo.xml') 
     AS foo_delimited 
+0

Non riesco a ottenere il rendering corretto dell'XML. Si può vedere il XML grezzo se si modifica la risposta :-( –