Fehlerbehebung von Transact-SQL Ingestionsfehlern mit Fehlerdateien

Gilt für:✅ Warehouse in Microsoft Fabric

In diesem Artikel wird beschrieben, wie Sie Fehler bei der Erfassung in T-SQL-Erfassungsmustern beheben.

Der Import in ein Lager unter Verwendung der Funktionen COPY INTO, BULK INSERT, OPENROWSET in den Anweisungen CTAS, INSERT, UPDATE und MERGE kann aus mehreren Gründen fehlschlagen. Quelldateiwerte stimmen möglicherweise nicht mit dem Tabellenschema überein. Erforderliche Werte fehlen möglicherweise. Aufnahmeoptionen sind möglicherweise auch falsch konfiguriert.

In diesem Handbuch zur Problembehandlung werden die Diagnoseinformationen für abgelehnte Zeilen verwendet, um Fehler auf Zeilenebene zu beheben und abgelehnte Zeilen mit Fehlermetadaten zu prüfen.

Indem Sie die von COPY INTO und anderen Aufnahmebefehlen generierten Fehlerdateien untersuchen, können Sie genau bestimmen, welche Zeilen nicht aufgenommen werden konnten und warum. Diese Informationen helfen Ihnen, Probleme mit der Datenqualität zu identifizieren oder die Einstellungen für die Datenaufnahme anzupassen, die Quelldaten zu korrigieren und die Ausführung zuversichtlich erneut durchzuführen.

Important

Diese Anweisungen gelten nur für das Aufnehmen von CSV- oder JSONL-Dateien mithilfe von Transact-SQL Befehlen (COPY INTO, BULK INSERTund DML mit OPENROWSET Funktion). Ausgabedateien für abgelehnte Zeilen werden für externe Aufnahmetools (z. B. Pipelines ), Parquet-Dateien oder beim Aufnehmen von Daten vom SQL Analytics Endpoint nicht generiert.

Erstellen der Zieltabelle

Erstellen Sie vor dem Ausführen von Aufnahmebefehlen eine Zieltabelle mit strengen Typen und NOT NULL Einschränkungen, sodass Sie Konvertierungs- und Datenqualitätsprobleme frühzeitig abfangen.

  1. Öffnen Sie In Ihrem Lagerarbeitsbereich Ihr Lager.

  2. Wählen Sie auf der Registerkarte " Start " die Option "Neue SQL-Abfrage" aus.

    Screenshot: Oberer Abschnitt des Benutzerarbeitsbereichs mit der Schaltfläche „Neue Abfrage“

  3. Führen Sie die folgende Anweisung aus:

    DROP TABLE IF EXISTS dbo.TaxiTrips;
    GO
    CREATE TABLE dbo.TaxiTrips
    (
        vendorID         int    NOT NULL,
        startLat         float  NOT NULL,
        startLon         float  NOT NULL,
        endLat           float  NOT NULL,
        endLon           float  NOT NULL,
        passengerCount   int    NOT NULL,
        tripDistance     float  NOT NULL,
        fareAmount       float  NOT NULL,
        mtaTax           float  NOT NULL,
        totalAmount      float  NOT NULL
    );
    

Sie können mehrere unterstützte Methoden verwenden, z. B. das Aufnehmen mit COPY INTO oder das Aufnehmen mit Transact-SQL. Wählen Sie die Aufnahmemethode aus, die ihren Anforderungen an Datenquelle, Format und Automatisierung am besten entspricht. Das folgende COPY INTO-Beispiel veranschaulicht ein allgemeines Aufnahmemuster zum Laden von Daten aus externen Dateien in eine Tabelle.

COPY INTO [dbo].[TaxiTrips]
FROM 'https://{storage-path}.blob.core.windows.net/Files/yellow/'
WITH ( FILE_TYPE = 'CSV' );

Diese Anweisung kann keine Daten aufnehmen, wenn die Quelldateien nicht mit dem Zieltabellenschema übereinstimmen. Häufige Ursachen sind nicht übereinstimmende Spaltenanzahlen, inkompatible Datentypen oder Werte, die nicht in der Zieltabelle gespeichert werden können. Wenn bei der Aufnahme Werte gefunden werden, die nicht in das Zielschema konvertiert werden können, gibt die Anweisung einen Fehler ähnlich dem folgenden zurück.

Msg 13812, Level 16, State 1, Line 2
Bulk load data conversion error (type mismatch or invalid character for the specified codepage)
for row starting at byte offset 0, column 1 (vendorID).
Underlying data description:
file 'https://....blob.core.windows.net/Files/yellow/tripdata.csv'.

Dieser Fehler gibt an, dass mindestens eine Zeile nicht in die Zielspaltentypen konvertiert werden kann.

Untersuchen von Fehlern mit MAXERRORS und ERRORFILE

Verwenden Sie die folgenden Optionen, um die Aufnahme fortzusetzen, wenn die Anzahl der Fehler auf Zeilenebene unter einem definierten Schwellenwert liegt und Diagnosedetails an einem bestimmten Speicherort gespeichert werden soll.

  • MAXERRORS legt die maximale Anzahl tolerierter Fehler auf Zeilenebene während der Aufnahme fest.
  • ERRORFILE Gibt an, wo die Datenbank abgelehnte Zeilen und Fehlerdetails schreibt.
COPY INTO [dbo].[TaxiTrips]
FROM 'https://{storage-path}.blob.core.windows.net/Files/yellow/'
WITH (
    FILE_TYPE = 'CSV',
    MAXERRORS = 10,
    ERRORFILE = 'https://{storage-path}.blob.core.windows.net/Files/yellow/'
);

Important

Konfigurieren Sie ERRORFILE unter demselben Speicherort, der für Lesevorgänge aus der Quelldatei verwendet wird, nicht in einem anderen Speicherkonto. Die identität, die für den Zugriff auf Quelldaten verwendet wird, muss auch über Berechtigungen zum Erstellen von Ordnern und Dateien im konfigurierten Fehlerpfad verfügen.

Der Ladevorgang ist nur erfolgreich, wenn die Anzahl der abgelehnten Zeilen niedriger als MAXERRORSist. Wenn Fehler erfasst werden, schreibt der Einspeisevorgang Folgendes:

  • error.jsonl für strukturierte Diagnosen
  • row.csv für abgelehnte Quellzeilen

Suchen und Abfragen abgelehnter Zeilen

Die Datenbank schreibt Fehlerinformationen in eine strukturierte Ordnerhierarchie unter dem konfigurierten Fehlerspeicherort. Diese Ordner helfen Ihnen, eine bestimmte Ausführung nachzuverfolgen und Diagnosedaten mit einem spezifischen Ingestion-Befehl zu korrelieren.

ERRORFILE/
+-- _rejectedrows/
    +-- <timestamp>/
        +-- <statement_id>/
            +-- error.jsonl
            +-- row.csv or rows.jsonl

Verwenden Sie OPENROWSET, um die strukturierte Diagnose in error.jsonl zu lesen, sodass Sie ermitteln können, welcher Wert fehlgeschlagen ist, welche Zielspalte betroffen war und woher die fehlerhafte Zeile stammt:

SELECT *
FROM OPENROWSET(
    BULK 'https://{storage-path}.blob.core.windows.net/Files/yellow/_rejectedrows/*/*/error.jsonl'
);

Das Resultset enthält in der Regel eine Zeile pro abgelehnten Datensatz, z. B.:

Fehler Kolumne ColumnName Wert WirdAusgegeben Datei ErrorRowLocation
Fehler bei der Datenkonvertierung 1 vendorID vendorID 1 https://.../yellow/tripdata.csv 0
NULL in nicht-nullfähiger Spalte 1 vendorID NULL 1 https://.../yellow/ytripdata.csv 399
Fehler bei der Datenkonvertierung 6 passengerCount N/A 1 https://.../yellow/yellow_tripdata.csv 519

Die error.jsonl Datei enthält ein JSON-Objekt pro Zeile. Jedes Objekt enthält die in der vorherigen Tabelle aufgeführten Eigenschaften. In der folgenden Tabelle werden die einzelnen Eigenschaften ausführlich beschrieben.

Kolumne Beschreibung
Error Stellt die Fehlermeldung bereit, die erläutert, warum der Wert während der Eingabe abgelehnt wurde.
Column Gibt den Index der Spalte in der CSV-Quelldatei an, die den Wert enthält, der nicht aufgenommen werden konnte. Die Spaltenindizierung beginnt bei 1 der ersten Spalte.
ColumnName Gibt den Namen der Zieltabellenspalte an, in der der Wert nicht gespeichert werden konnte.
Value Quellwert, der nicht konvertiert oder überprüft werden konnte.
IsOutputted Gibt an, ob die Zeile aus der Quelldatei, die den gemeldeten Fehler enthält, auch in die Ausgabedatei der abgelehnten Zeilen (row.csv oder row.jsonl) geschrieben wird. Ein Wert von 1 (oder true in JSONL-Dateien) bedeutet, dass die Zeile in error.csvgeschrieben wird, und ein Wert von 0 (oder false in den JSONL-Dateien) bedeutet, dass sie nicht.
File Gibt die Quelldatei an, aus der die abgelehnte Zeile stammt. Mit diesem Wert können Sie die abgelehnten Daten zurück zur ursprünglichen Eingabedatei zur Untersuchung nachverfolgen.
ErrorRowLocation Byte-Offsetposition in der Quelldatei, in der der Fehler aufgetreten ist.

Abgelehnte Zeilen überprüfen

Nachdem Sie die strukturierten Diagnoseinformationen überprüft haben, können Sie die ursprünglichen Quelldaten prüfen, die die Datenbank nicht aufnehmen konnte. Die Ausgabe der abgelehnten Zeilen enthält Kopien der Quelldatensätze, die genau so erhalten bleiben, wie sie in den Eingabedateien angezeigt wurden. Die Diagnose der abgelehnten Zeilen generiert Dateien, die nur die Datensätze enthalten, die fehlgeschlagen sind:

  • Wenn Sie CSV-Dateien mit COPY INTO (FILE_TYPE = 'CSV') importieren, enthält die abgelehnte Ausgabe eine row.csv-Datei. Diese Datei entspricht der Quelldateistruktur und enthält die ursprünglichen CSV-Zeilen mit ungültigen Werten.
  • Wenn Sie JSONL-Dateien mithilfe von OPENROWSET(FORMAT = 'JSONL') ingestieren, enthält die abgelehnte Ausgabe eine row.jsonl Datei. Diese Datei behält die ursprünglichen JSON-Objekte bei, die zu Aufnahmefehlern geführt haben.

Verwenden Sie diese Dateien, um die Ursache der Fehler zu überprüfen, z. B. falsch formatierte Werte, unerwartete NULL Werte oder Kopfzeilen, die falsch als Daten analysiert wurden.

SELECT *
FROM OPENROWSET(
    BULK 'https://{storage-path}.blob.core.windows.net/Files/yellow/_rejectedrows/*/*/row.csv'
);

Das row.csv Schema stimmt mit dem CSV-Quell-Shape überein, und es enthält nur Zeilen, bei denen die Erfassung fehlgeschlagen ist.

Beispiel für abgelehnte Zeilenausgabe:

C1 C2 C3 C4 C5 C6 C7 C8 C9 C10
vendorID startLat startLon endLat endLon passengerCount tripDistance fareAmount mtaTax totalAmount
NULL 40.7484 -73.9857 40.7549 -73.9840 2 1.40 9.00 0,50 13.20
1 40.7216 -74.0047 40.7359 -74.0036 N/A 1.80 11.00 0,50 15.90

Basierend auf diesen Diagnoseinformationen können Sie die folgenden Aufnahmeprobleme identifizieren:

  • Die Kopfzeile in der Quelldatei wird versehentlich als Datenzeile analysiert. Um dies zu beheben, sollte die COPY INTO Anweisung die FIRSTROW = 2 Option verwenden.
  • Eine Zeile in der Quelldatei für die vendorID Spalte (C1) enthält NULL Werte, aber die entsprechende Spalte in der Zieltabelle TaxiTrips ist definiert als NOT NULL.
  • Eine Zeile in der Quelldatei für die passengerCount Spalte enthält einen ungültigen Wert (N/A), der nicht in die Zielspalte konvertiert werden kann.

Note

Derselbe Prozess gilt, wenn Sie abgelehnte Zeilen aus JSONL-Eingabe untersuchen. Verwenden Sie die row.jsonl Datei, um die abgelehnten Datensätze zu prüfen.

Beheben von Aufnahmeproblemen und erneutes Aufnehmen von Daten

Nachdem Sie die Ursache für Datenübernahmefehler identifiziert haben, beheben oder korrigieren Sie das Problem und übernehmen Sie die betroffenen Daten erneut. Der Lösungsansatz hängt davon ab, wo der Fehler entsteht.

Korrigieren des Zieltabellenschemas

Wenn die Quelldaten nicht dem Zieltabellenschema entsprechen, aktualisieren Sie die Tabellendefinition. Häufige Korrekturen umfassen das Ändern von Spaltendatentypen oder das Entfernen restriktiver Einschränkungen wie NOT NULL.

In einigen Szenarien müssen Sie die Zieltabelle möglicherweise ablegen und neu erstellen, bevor Sie die Daten erneut aufnehmen.

Korrektur von Quelldaten und Wiedereinlesen von Dateien

Wenn die Aufnahme aufgrund ungültiger oder inkonsistenter Werte in den Quelldateien fehlschlägt, korrigieren Sie diese Werte, und nehmen Sie die Daten erneut auf. Ersetzen Sie beispielsweise Platzhalterwerte, wie N/A, durch leere Werte oder gültige Standardwerte.

COPY INTO [dbo].[TaxiTrips]
FROM 'https://{storage-path}.blob.core.windows.net/Files/yellow/tripdata_corrected.csv'
WITH ( FILE_TYPE = 'CSV' );

Verwenden Sie beim erneuten Aufnehmen korrigierter Daten einen expliziten Dateipfad, der auf die neue Datei verweist, die nur korrigierte Daten enthält, anstatt einen Ordnerpfad, der auf die ursprünglichen Dateien verweist. Dieser Ansatz verhindert das erneute Aufnehmen von Zeilen, die zuvor erfolgreich geladen wurden, und verhindert doppelte Daten.

Erneutes Verarbeiten abgelehnter Zeilen mithilfe einer Stagingtabelle

Sie können abgelehnte Zeilen in eine Stagingtabelle laden, die Daten mithilfe Transact-SQL Datenänderungsanweisungen korrigieren und dann die korrigierten Zeilen erneut aufnehmen.

Die folgende CREATE TABLE AS SELECT Anweisung lädt abgelehnte Zeilen in eine Tabelle zur weiteren Verarbeitung:

CREATE TABLE TaxiTrip_RejectedRows AS
SELECT *
FROM OPENROWSET(
    BULK 'https://{storage-path}.blob.core.windows.net/Files/yellow/_rejectedrows/*/*/row.csv'
);

Nachdem Sie die Daten korrigiert haben, fügen Sie die bereinigten Zeilen in die Zieltabelle ein.