>Se ho capito bene il programma bcp serve a creare il file di
>formato e collegare le colonne della tabella MS Sql con le colonne
>del file csv.
>
>E' così?
No. BCP.exe è una piccola applicazione che serve per importare o esportare in modo estremamente efficiente i dati da/su file.
BLUK INSERT è un comando T-SQL che serve esclusivamente per importare i dati da un file, sfruttando le stesse identiche Bulk Copy API utilizzate anche da BCP.exe.
Ed ecco la soluzione al tuo problema.
Prima di tutto definisco il file C:\Comuni.fmt:
9.0
4
1 SQLCHAR 0 35 "," 2 Comune SQL_Latin1_General_CP1_CI_AS
2 SQLCHAR 0 5 "," 3 Cap SQL_Latin1_General_CP1_CI_AS
3 SQLCHAR 0 2 "," 4 Provincia SQL_Latin1_General_CP1_CI_AS
4 SQLCHAR 0 5 "\r\n" 5 codCatastale SQL_Latin1_General_CP1_CI_AS
Come vedi è banalissimo:
- indico la dimensione delle colonne
- il separatore di colonna e di riga
- il mapping tra le colonne del file Comuni.csv con quelle della tabella (notare che la colonna 1 del file è mappata alla 2 della tabella, ecc)
- la collation delle colonne.
Questo invece è il codice T-SQL:
USE tempdb;
GO
CREATE TABLE dbo.Comuni(
Progressivo int IDENTITY(1,1) NOT NULL,
Comune varchar(35) NOT NULL,
Cap varchar(5) NOT NULL,
Provincia varchar(2) NOT NULL,
CodCatastale varchar(5) NOT NULL,
CONSTRAINT PK_Comuni PRIMARY KEY CLUSTERED (Progressivo)
);
BULK INSERT dbo.Comuni
FROM 'C:\Comuni.csv'
WITH (
FORMATFILE = 'C:\Comuni.fmt'
, FIRSTROW = 2
);
SELECT *
FROM dbo.Comuni;
/* Output:
Progressivo Comune Cap Provincia CodCatastale
----------- ----------------------------------- ----- --------- ------------
1 AGLIE' 10011 TO A074
2 AIRASCA 10060 TO A109
3 ALA DI STURA 10070 TO A117
4 ALBIANO D'IVREA 10010 TO A157
5 ALICE SUPERIORE 10010 TO A199
6 ALMESE 10040 TO A218
7 ALPETTE 10080 TO A221
8 ALPIGNANO 10091 TO A222
9 ANDEZENO 10020 TO A275
10 ANDRATE 10010 TO A282
11 ANGROGNA 10060 TO A295
12 ARIGNANO 10020 TO A405
13 AVIGLIANA 10051 TO A518
14 AZEGLIO 10010 TO A525
(14 row(s) affected)
*/
DROP TABLE dbo.Comuni;
Come puoi notare nel comando BULK COPY ho specificato l'opzione FIRSTROW = 2 dato che la prima riga del file che mi hai passato contiene il nome delle colonne (che non dovrebbe esserci).
In questo modo inizio l'importazione dalla seconda riga.
>grazie
Prego.
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org