# [SQL Server 2008] Alle csv Dateien in einem Verzeichnis als neue Tabellen importieren



## Thomas Darimont (20. April 2010)

Hallo,

hier mal ein Beispiel wie man mit einem kleinen Kommandozeilen Skript alle .csv Dateien in einem Verzeichnis als neue Tabellen in den SQL Server importieren kann:


```
set csvFolder=c:\temp\csv
set csvFiles=%csvFolder%\*.csv
set databaseServer=halwxp\SSAS2008
set databaseName=tutorials
set databaseSchema=dbo
for %f in (%csvFiles%) do start cmd /c  sqlcmd -S%databaseServer% -E -Q "select * into %databaseName%.%databaseSchema%.%~nf from openrowset('MSDASQL','Driver={Microsoft Text Driver (*.txt; *.csv)};DefaultDir=%csvFolder%','SELECT * FROM %~nf.csv')"
```

Dabei nutzen wir aus das select ... into NEUE_Tabelle die Tabelle anlegt wenn sie nicht existiert. Weiterhin verwenden wir
openrowset um die csv Dateien über ODBC anzusprechen. Wie genau die Spaltentypen für die neue Tabelle ermittelt werden
habe ich bisher noch nicht herausfinden können. Für mich sieht es derzeit so aus als würde das aus dem Inhalt der ersten Datenzeile
gelesen werden.

Um openrowset verwenden zu können muss man erst folgende Optionen einschalten:

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


Zur Verwendung von for in der Konsole:

```
C:\temp\csv>for %f in (c:\temp\csv\*.csv) do echo aus %f wird %~nf

C:\temp\csv>echo aus c:\temp\csv\dim_item.csv wird dim_item
aus c:\temp\csv\dim_item.csv wird dim_item

C:\temp\csv>echo aus c:\temp\csv\dim_store.csv wird dim_store
aus c:\temp\csv\dim_store.csv wird dim_store
```

Beispiel-Daten:

```
C:\temp\csv>dir
 Volume in Laufwerk C: hat keine Bezeichnung.
 Volumeseriennummer: 5CB8-E863

 Verzeichnis von C:\temp\csv

20.04.2010  19:22    <DIR>          .
20.04.2010  19:22    <DIR>          ..
20.04.2010  19:22                86 dim_item.csv
20.04.2010  19:22                50 dim_store.csv
               2 Datei(en)            136 Bytes
               2 Verzeichnis(se),  4.837.253.120 Bytes frei
```

Dim_Item.csv:

```
itemkey;itemname;baseunit;basequantity
1;Item1;ml;500
2;Item2;st;1
3;Item3;ml;500
```

Dim_Store.csv:

```
storekey;storename
1;store1
2;store2
3;store3
```

Dieser Ansatz lässt sich mit ein paar Anpassungen auch als generischer SSIS-Datenfluss Task umsetzen.

Läuft so unter WinXP mit 32-Bit SQLServer Installation. Unter Windows 7 64-Bit mit 64-Bit SQL Server hatte ich Probleme, da der MSDASQL','Driver={Microsoft Text Driver (*.txt; *.csv) nicht verfügbar war und sich auch nicht (als 64-Bit Variante) nachinstallieren lies.

Gruß Tom


----------



## Alex F. (22. April 2010)

Als SSIS Paket kannst du aber auch über eine ForEach Schleife direkt eine ganzen Ordner durchgehen  und diese dann über bedingtes Teilen in unterschiedliche Tabellen aufteilen. 
Aber trotzdem vielleicht hilfreich 

Grüsse
Alex


----------



## Thomas Darimont (22. April 2010)

Hallo,

klar geht das auch mit den SSIS, habe ich aber auch im Beitrag erwähnt. Das oben genannte Skript ist eher die Variante... "schnell mal eben alle csv-Dateien aus einem Verzeichnis in die Datenbank laden" ohne eine SSIS Solution erstellen bzw. anpassen zu müssen.

Gruß Tom


----------

