15

Sto cercando un modo rapido e sporco per importare file CSV in SQL Server senza dover creare preventivamente la tabella e definirne le colonne.Come creare e popolare una tabella in una singola fase come parte di un'operazione di importazione CSV?

Ogni CSV importato verrà importato nella propria tabella.

Non siamo preoccupati per l'inferenza del tipo di dati. Il CSV varia a seconda della struttura e del layout e tutti hanno molte colonne, eppure ci interessano solo alcuni di essi: indirizzi e codici postali. Vogliamo solo ottenere rapidamente i dati CSV nel database SQL ed estrarre le colonne pertinenti.

Mi piacerebbe fornire il FieldTerminator e il RowTerminator, puntarlo verso il CSV e fare in modo che l'utility faccia il resto. C'è un modo per creare la tabella e popolarla, tutto in un unico passaggio, usando BULK INSERT e/o OpenRowset (BULK ...)?

+0

Quale versione di SQL Server? –

+0

Sql Server 2000 – Tim

risposta

11

Referencing SQLServerPedia, penso che questo funzionerà:

sp_configure 'show advanced options', 1; 
RECONFIGURE; 
GO 
sp_configure 'Ad Hoc Distributed Queries', 1; 
RECONFIGURE; 
GO 

select TerritoryID 
     ,TotalSales 
     ,TotalCost 
INTO CSVImportTable 
from openrowset('MSDASQL' 
       ,'Driver={Microsoft Access Text Driver (*.txt, *.csv)}' 
       ,'select * from C:\csvtest.CSV') 
+0

Grazie. Ho dovuto utilizzare Microsoft Text Driver anziché Microsoft Access Text Driver, ma l'importazione ha funzionato. Tuttavia ho ricevuto questo messaggio di errore (anche se l'importazione ha funzionato nonostante): Messaggio 15123, livello 16, stato 1, procedura sp_configure, riga 79 L'opzione di configurazione 'query distribuite ad hoc' non esiste o potrebbe essere avanzata opzione. – Tim

+0

È necessario eseguire 'RECONFIGURE' per le opzioni avanzate prima di poter configurare l'opzione ad-hoc. Ci dovrebbe essere un altro GO dopo il primo RECONFIGURE. Riediterò. – TyT

5

Fastidioso, non ho ancora i punti rep di commentare solo, quindi mi aggiungere una risposta basata su TyT di (che sembra terribile maniglia in possessivo, btw ...)

Il codice worker richiedeva un doppio "\" invece di un singolo per evitare un errore "file non trovato". E non devi specificare i campi; verranno dedotti dalla prima riga del file:

select * 
into CsvImportTable 
from openrowset(
      'MSDASQL', 
      'Driver={Microsoft Access Text Driver (*.txt, *.csv)}', 
      'select * from C:\\csvtestfile.csv') 

Non ho avuto problemi con il driver di accesso.

AGGIORNAMENTO: Se si verificano problemi con i tipi che vengono dedotti in modo errato, inserire alcune righe nella parte superiore del file con i dati del tipo desiderato nella tabella in modo da ottenere, ad esempio testo -> VARCHAR anziché testo- > INT e quindi cancella quelle righe dopo l'importazione.

Come la ciliegina finale, aggiungere un PK al tavolo in modo da poter manipolare i dati - eliminare le righe fittizie, ecc:

alter table CsvImportTable add Id int identity(1, 1) 
+1

Per quello che vale, aggiungendo i dettagli al tuo profilo. I tuoi punti di ripetizione aumentano. –