Fokus: Import aus Sicht des SQL Servers – nicht aus Excel
Wir reden hier nicht über „Datei öffnen und per Copy/Paste reinziehen“.
Wir reden über stabile, wiederholbare Imports von Excel-Dateien in SQL Server.
Automatisierbar, kontrollierbar, mit Fehlerprotokoll.
Und möglichst ohne viel händische Nacharbeit.
Variante 1: OPENROWSET
– direkt im SQL Server
Funktioniert gut, wenn auf dem Server die richtigen Treiber installiert sind (ACE/Jet).
Beispiel:
SELECT *
INTO dbo.ExcelImportTemp
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 12.0 Xml;HDR=YES;Database=C:\Import\kunden.xlsx',
'SELECT * FROM [Tabelle1$]');
Voraussetzungen:
Ad Hoc Distributed Queries
aktiviert- ACE-OLEDB-Provider installiert
- Datei muss auf dem SQL Server erreichbar sein (Pfad aus Server-Sicht)
Vorteil:
- Einfach und schnell für einmalige oder manuelle Importe
Nachteil:
- Kein Logging
- Keine Wiederverwendung
- Fragil bei Änderungen in der Excel-Struktur
Variante 2: SSIS – SQL Server Integration Services
Die solide Variante für Profis.
Kommt mit Visual Studio und SQL Data Tools.
Vorteile:
- Validierung, Transformation, Mapping
- Logging und Fehlerweiterleitung
- Kann Daten direkt in Staging-Tabellen einlesen
- Zeitgesteuerte Verarbeitung über SQL Agent
Typisches Setup:
- Excel-Source
- Data Conversion
- Conditional Split (für Fehler)
- Ziel: Staging- oder Zieltabelle
Nachteil:
- Komplex in der Einrichtung
- Deployment auf Produktivsystem braucht Rechte und Pflege
Variante 3: BULK INSERT
mit vorheriger Umwandlung in CSV
Wenn Du keine Lust auf Excel-Treiber hast.
Dann wandelst Du die Datei in .csv
und nimmst BULK INSERT
.
Beispiel:
BULK INSERT dbo.Kunden
FROM 'C:\Import\kunden.csv'
WITH (
FIRSTROW = 2,
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n',
CODEPAGE = '65001',
TABLOCK
);
Vorteil:
- Schnell
- Gut skriptbar
- Keine Excel-abhängige DLLs nötig
Nachteil:
- Kein Spaltenmapping
- Kein Header-Check
- Keine Transformationen möglich
Variante 4: T-SQL + VBA + Zugriff über Access oder ADO
Wenn Du den Import aus Access heraus steuerst, aber in SQL importierst – geht auch.
Public Sub ExcelNachSQL()
Dim conn As Object
Set conn = CreateObject("ADODB.Connection")
conn.Open "Provider=SQLOLEDB;Data Source=DEINSERVER;Initial Catalog=DEINDB;Integrated Security=SSPI"
conn.Execute "EXEC dbo.sp_ImportiereExcel 'C:\Import\kunden.xlsx'"
conn.Close
End Sub
Voraussetzung: Du baust Dir ein Stored Procedure, das per OPENROWSET
oder SSIS-Paket importiert.
Vorteil:
- Trennung von Oberfläche (Access) und Logik (SQL Server)
- Automatisierbar aus Formular, Button oder Batch
Empfehlung: Immer in eine Staging-Tabelle laden
Warum? | Erklärung |
---|---|
Trennung | Rohdaten ≠ Zieldaten |
Fehlerprotokoll | Du kannst ungültige Zeilen rausfiltern |
Wiederholbarkeit | Gleicher Prozess, andere Datei |
Rückverfolgbarkeit | Wer, wann, was |
INSERT INTO dbo.Kunden
SELECT * FROM dbo.ExcelImportTemp
WHERE Email IS NOT NULL AND Kundennummer IS NOT NULL
Fehlerhandling: Ein Muss
Beispiel: Fehler zählen
SELECT COUNT(*) AS FehlerhafteZeilen
FROM dbo.ExcelImportTemp
WHERE ISNUMERIC(Kundennummer) = 0 OR Email NOT LIKE '%@%'
Logging-Tabelle:
Zeitstempel | Datei | Fehler | Benutzer |
---|---|---|---|
2024-05-08 08:34:01 | kunden.xlsx | 12 | MAXMUSTERMANN |
Excel-Importe sind nie ganz sauber.
Aber Du kannst sie mit den richtigen SQL-Werkzeugen stabilisieren.
Kein Copy-Paste. Kein Adhoc-Gefrickel.
Wenn Du willst, bau ich Dir den Prozess:
stabil, nachvollziehbar, wiederverwendbar – und mit Button in Access, wenn’s sein muss.
No responses yet