Schritt-für-Schritt: Wie Du Excel-Daten sicher in SQL importierst

Warum überhaupt sicher?

Excel-Daten sind fehleranfällig.
Leere Zeilen, merkwürdige Formate, Text statt Zahlen.
Wenn Du das blind in SQL schiebst, hast Du bald mehr Chaos als Daten.

Ich zeige Dir, wie Du das kontrolliert, strukturiert und wiederholbar machst – mit VBA.

Grundidee: Erst prüfen, dann laden

Vorgehensweise

  1. Excel-Datei analysieren
  2. Struktur validieren
  3. Temporär Importieren
  4. In Zieltabelle verschieben
  5. Fehler protokollieren

Vorbereitung: Verbindung zu SQL Server

Stell zuerst die Verbindung her.

Public Function GetSQLConnection() As Object
    Dim conn As Object
    Set conn = CreateObject("ADODB.Connection")
    conn.Open "Provider=SQLOLEDB;" & _
              "Data Source=DEIN_SQLSERVER;" & _
              "Initial Catalog=DEINE_DATENBANK;" & _
              "Integrated Security=SSPI;"
    Set GetSQLConnection = conn
End Function

Schritt 1: Excel-Datei öffnen und prüfen

Public Function PrüfeExcelPfad(pfad As String) As Boolean
    If Dir(pfad) = "" Then
        MsgBox "Datei nicht gefunden: " & pfad
        PrüfeExcelPfad = False
    Else
        PrüfeExcelPfad = True
    End If
End Function

Schritt 2: Import in temporäre Tabelle

Ich empfehle, immer zuerst in eine temporäre Importtabelle zu schreiben.
Dann kannst Du Spalten prüfen, Datentypen kontrollieren, Dubletten vermeiden.

Public Sub ImportiereExcel(pfad As String)
    Dim sql As String
    sql = "SELECT * INTO dbo.ExcelImport_Temp FROM " & _
          "OPENROWSET('Microsoft.ACE.OLEDB.12.0'," & _
          "'Excel 12.0 Xml;HDR=YES;IMEX=1;Database=" & pfad & "'," & _
          "'SELECT * FROM [Tabelle1$]')"

    Dim conn As Object
    Set conn = GetSQLConnection()
    conn.Execute "IF OBJECT_ID('dbo.ExcelImport_Temp') IS NOT NULL DROP TABLE dbo.ExcelImport_Temp"
    conn.Execute sql
    conn.Close
End Sub

Schritt 3: Validierung

Du prüfst nun auf Pflichtfelder, Formate oder Dubletten.

Public Sub ValidierungStarten()
    Dim conn As Object, rs As Object
    Set conn = GetSQLConnection()
    Set rs = conn.Execute("SELECT COUNT(*) AS Fehler FROM dbo.ExcelImport_Temp WHERE Artikelnummer IS NULL")

    If rs!Fehler > 0 Then
        MsgBox rs!Fehler & " Datensätze ohne Artikelnummer."
    Else
        MsgBox "Alle Pflichtfelder vorhanden."
    End If

    rs.Close: conn.Close
End Sub

Schritt 4: Daten verschieben

Nur gültige Datensätze landen in der Zieltabelle.

Public Sub ÜbernehmeGültigeDaten()
    Dim conn As Object
    Set conn = GetSQLConnection()

    conn.Execute "INSERT INTO dbo.Artikel (Artikelnummer, Bezeichnung, Preis) " & _
                 "SELECT Artikelnummer, Bezeichnung, Preis " & _
                 "FROM dbo.ExcelImport_Temp " & _
                 "WHERE Artikelnummer IS NOT NULL"

    conn.Close
End Sub

Schritt 5: Aufräumen und protokollieren

Lösch die temporäre Tabelle, oder führ ein Protokoll.

Public Sub Aufräumen()
    Dim conn As Object
    Set conn = GetSQLConnection()
    conn.Execute "DROP TABLE dbo.ExcelImport_Temp"
    conn.Close
End Sub

Typische Fehlerquellen

  • Zellformatierungen (Text statt Zahl)
  • Leere Zeilen oder Spalten
  • Nicht definierte Tabellenblätter
  • Excel-Datei offen beim Import

Meine Empfehlung

Lass Excel nie direkt in SQL schreiben.
Baue Dir eine Importstrecke mit Prüfung, Logging und Feedback.
Dann kannst Du das Ganze auch jemandem übergeben, der keine Ahnung von SQL hat.

Kategorien:

Schlagwörter: