Yasin_k93 0 Geschrieben 3. Februar 2021 Melden Teilen Geschrieben 3. Februar 2021 (bearbeitet) Hallo liebes Forum, ich habe einige Foren nach einer Lösung für mein Problem durchforstet aber leider keine Lösung gefunden. Deshalb wende ich mich an euch, in der Hoffnung, eine Lösung zu finden. Es handelt sich um ein SQL Server 11.0. Es sollen in eine Datenbank ca. 90-100 CSV Dateien mehrmals im Jahr importiert werden. Die Tabellenstrukturen können sich aber bei jedem Import ändern. D.h. man hat bspw. heute eine CSV-Datei mit 28 Spalten und in einem halben Jahr hat genau diese Datei nur noch 27 Spalten. So kann ich die ganze Tabelle wegschmeißen und die Struktur neu anlegen oder mir alle Spalten anschauen und herausfinden, welche Spalte fehlt oder zu viel drin ist. Ich habe das ganze Vorgehen insoweit automatisiert, dass ich die CSV-Dateien, welche sich in einem bestimmten Pfad befindet, in eine Tabelle schreibe (Dateiname, Dateityp, etc.) und diese in eine Schleife eingebunden habe (siehe nachfolgend das Statement dazu): --Tabelle für neue CSV-Dateien leeren TRUNCATE TABLE CSV_Files; PRINT 'Tabelle für CSV-Dateien geleert' --CSV-Dateinamen in die Tabelle einfügen INSERT INTO CSV_Files(Dateiname, Tiefe, Datei) EXEC master..xp_dirtree 'C:\Bsp_Ordner', 1, 1 PRINT 'CSV-Dateien in die Tabelle CSV_Files geschrieben' --Dateityp in separate Spalte schreiben UPDATE CSV_Files SET Dateityp = '.csv', Dateiname = REPLACE(Dateiname, '.csv', '') DECLARE @i int = 1 DECLARE @Zaehler int = (SELECT MAX(ID_CSV) FROM CSV_Files) DECLARE @Filename varchar(50) DECLARE @File varchar(50) DECLARE @Ext varchar(50) DECLARE @Tablename varchar(50) DECLARE @Truncate varchar(200) DECLARE @Befehl varchar(2000) SET @Ext = '.csv' WHILE @i <= @Zaehler BEGIN PRINT 'Schleife Nr: ' +CAST(@i as varchar) SET @Filename = (SELECT Dateiname FROM CSV_Files WHERE ID_CSV = @i) SET @Tablename = @Filename SET @Truncate = 'TRUNCATE TABLE '+@Tablename SET @File = @Filename + @Ext SET @Befehl = 'BULK INSERT '+@Tablename+' FROM ''C:\Bsp_Ordner\'+@File+''' WITH( FIRSTROW = 2, FIELDTERMINATOR = ''0x3b'', ROWTERMINATOR = ''\n'' )' EXEC (@Truncate) PRINT 'Tabelle '+@Tablename+' wurde gelöscht' EXEC (@Befehl) PRINT 'Tabelle '+@Tablename+' wurde befüllt ' SET @i = @i + 1 PRINT 'Als nächstes Schleife Nr: ' +CAST(@i as varchar) END Solange die alte Tabellenstruktur mit der Struktur in der entsprechenden CSV-Datei übereinstimmt, läuft die Schleife auch einwandfrei durch und liefert mir genau das Ergebnis, welches ich erwarte. Nun meine Frage an euch: Gibt es eine Möglichkeit, CSV-Dateien per Code einfach nur auszulesen (somit könnte ich die Tabellen bei jedem Import komplett wegschmeißen und durch das Auslesen neu anlegen. Anschließend gehts weiter mit der Schleife, welches dann problemlos durchlaufen würde) ? Oder gibt es eine Möglichkeit, per Code die CSV-Dateien direkt in neue Tabellen (Strukturen aus der CSV-Datei) zu importieren? Das passiert ja, wenn ich manuell über die Datenbank -> Tasks.. -> Datei importieren einzelne CSV-Dateien importiere. Da wird ja als Zieltabelle entweder eine bestehende ausgewählt oder wenn nicht vorhanden, eine neue angelegt. Ich hoffe, ihr könnt mir bei diesem Problem helfen. Ich verzweifle schon so langsam, weil ich seit Wochen keine Lösung dazu gefunden habe und es nicht zumutbar ist, 100 CSV-Dateien einzeln zu importieren. Beste Grüße Yasin bearbeitet 4. Februar 2021 von Yasin_k93 Schönheitsfehler im Code Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.