BULK INSERT - Problema di Apici

lunedì 16 ottobre 2006 - 18.29

gmt Profilo | Junior Member

Salve,

dopo aver perso un pomeriggio a cercare di capire, mi trovo costretto ad aprire un Thread, sto cercando di fare un import con la BULK INSERT (SQL Server 2000).
Sono 845Mb di file testo, ogni mese ci saranno 845Mb di file testo !!!
Pero' rimarranno solo 2-3 mesi al massimo (verrà effettuato uno storico dei dati su altro db)

il file di testo è così formato

"500;"200605";45.89;23;67;"S";98
...............

I campi di testo sono delimitati dal doppio apice i campi numerici invece no.
Il delimitatore di campo è il punto e virgola (;)

Quando importo con il comando


BULK INSERT PDW_SARDB
FROM 'C:\Sviluppo\dati_parz.csv'
WITH
(
FIRSTROW=2,
FIELDTERMINATOR=';',
MAXERRORS=0
)

Nel db il primo campo contiene anche gli apici "500", mentre io vorrei che ci fosse solo 500.
Non esiste un Argomento per definire questo? .. Oppure devo togliere gli apici dal file di testo di 845Mb !!

Grazie e scusate

lbenaglia Profilo | Guru

>il file di testo è così formato
>
>"500;"200605";45.89;23;67;"S";98
>...............
>
>I campi di testo sono delimitati dal doppio apice i campi numerici
>invece no.
>Il delimitatore di campo è il punto e virgola (;)

Ciao gmt,

La virgoletta a sinistra del numero 500 ti è scappata, vero?
L'hai aperta ma non è mai stata chiusa!
Dato che il formato non è uniforme per tutti i valori (alcuni sono delimitati dai doppi apici altri no), sei costretto a ricorrere ad un file di formato.
Cos'è un file di formato? Un file di testo che definisce il tracciato record del file di testo che devi importare.

Prima di tutto aggiungiamo qualche riga al file di input dati_parz.csv:

500;"200605";45.89;23;67;"S";98 501;"200606";67.12;89;564;"N";155 502;"200607";24.00;41;244;"N";154 503;"200608";39.18;98;3556;"S";4565 504;"200609";99.99;33;96;"N";3644

Ora andiamo a definire la tabella che andrà a contenere i dati:

USE tempdb; GO CREATE TABLE dbo.PDW_SARDB( Col1 int NOT NULL, Col2 char(6) NOT NULL, Col3 decimal(4,2) NOT NULL, Col4 int NOT NULL, Col5 int NOT NULL, Col6 char(1) NOT NULL, Col7 int NOT NULL ); GO

A questo punto prepariamo il file di formato C:\dati_parz.fmt:

8.0 7 1 SQLCHAR 0 4 ";\"" 1 Col1 "" 2 SQLCHAR 0 6 "\";" 2 Col2 Latin1_General_CI_AS 3 SQLCHAR 0 19 ";" 3 Col3 "" 4 SQLCHAR 0 4 ";" 4 Col4 "" 5 SQLCHAR 0 4 ";\"" 5 Col5 "" 6 SQLCHAR 0 1 "\";" 6 Col6 Latin1_General_CI_AS 7 SQLCHAR 0 4 "\r\n" 7 Col7 ""

Infine non ci resta che eseguire la BULK INSERT verificando che tutto sia andato per il meglio:

BULK INSERT dbo.PDW_SARDB FROM 'C:\dati_parz.csv' WITH (FORMATFILE = 'C:\dati_parz.fmt'); GO /* Output: (5 row(s) affected) */ SELECT * FROM dbo.PDW_SARDB; GO /* Output: Col1 Col2 Col3 Col4 Col5 Col6 Col7 ----------- ------ ------ ----------- ----------- ---- ----------- 500 200605 45.89 23 67 S 98 501 200606 67.12 89 564 N 155 502 200607 24.00 41 244 N 154 503 200608 39.18 98 3556 S 4565 504 200609 99.99 33 96 N 3644 (5 row(s) affected) */ DROP TABLE dbo.PDW_SARDB;

Sui Books Online troverai tutte le informazioni che ti servono per capire il significato di tutti i parametri che costituiscono un file di formato:

"Using Format Files"
http://msdn.microsoft.com/library/en-us/adminsql/ad_impt_bcp_9yat.asp

>Grazie e scusate
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

gmt Profilo | Junior Member

Grazie.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5