Thomas Darimont
Erfahrenes Mitglied
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:
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:
Zur Verwendung von for in der Konsole:
Beispiel-Daten:
Dim_Item.csv:
Dim_Store.csv:
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
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:
Code:
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:
Code:
sp_configure 'show advanced options', 1
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
RECONFIGURE
GO
Zur Verwendung von for in der Konsole:
Code:
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:
Code:
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:
Code:
itemkey;itemname;baseunit;basequantity
1;Item1;ml;500
2;Item2;st;1
3;Item3;ml;500
Dim_Store.csv:
Code:
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