Feilsøk Transact-SQL inntastingsfeil med feilfiler

Gjelder for:✅ Warehouse i Microsoft Fabric

Denne artikkelen beskriver hvordan man feilsøker inntastingsfeil i T-SQL-inntastingsmønstre.

Inntasting i et lager ved bruk av COPY INTO, BULK INSERT, funksjon OPENROWSET i CTAS, INSERT, UPDATE, og MERGE setninger kan feile av flere grunner. Kildefilverdiene kan ikke samsvare med tabellskjemaet. Nødvendige verdier kan mangle. Inntaksalternativene kan også være feilkonfigurert.

Denne feilsøkingsguiden bruker diagnostikkinformasjonen for avviste rader til å løse feil, fange opp radnivåfeil og inspisere avviste rader med feilmetadata.

Ved å undersøke feilfilene generert av COPY INTO og andre inntastingskommandoer, kan du nøyaktig finne ut hvilke rader som ikke ble innhentet og hvorfor. Denne informasjonen hjelper deg å identifisere datakvalitetsproblemer eller justere inntastingsinnstillinger, rette kildedataene og kjøre belastningen på nytt med trygghet.

Important

Disse instruksjonene gjelder kun for innhenting av CSV- eller JSONL-filer ved å bruke Transact-SQL kommandoer (COPY INTO, BULK INSERT, og DML med OPENROWSET funksjon). Utdatafiler for avviste rader genereres ikke for eksterne inntastingsverktøy (som pipelines ), Parquet-filer eller når data tas inn fra SQL-analyse-endpoint.

Opprett måltabellen

Før du kjører inntastingskommandoer, lag en destinasjonstabell med strenge typer og NOT NULL begrensninger slik at du oppdager konverterings- og datakvalitetsproblemer tidlig.

  1. Åpne lageret ditt i arbeidsområdet ditt.

  2. Hjem-fanen velger du Ny SQL-spørring.

    Skjermbilde av den øverste delen av brukerens arbeidsområde som viser ny SQL-spørringsknapp.

  3. Kjør følgende uttalelse:

    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
    );
    

Du kan bruke flere støttede metoder, inkludert innlevering med COPY INTO eller innlevering med Transact-SQL. Velg den innsamlingsmetoden som passer best til dine behov for datakilde, format og automatisering. Følgende COPY INTO-eksempel illustrerer et vanlig inntastingsmønster for lasting av data fra eksterne filer inn i en tabell.

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

Denne setningen kan feile i å ta inn data hvis kildefilene ikke samsvarer med destinasjonstabellens skjema. Vanlige årsaker inkluderer uoverensstemmende kolonneantall, inkompatible datatyper eller verdier som ikke kan lagres i måltabellen. Hvis inntak møter verdier som ikke kan konverteres til destinasjonsskjemaet, returnerer setningen en feil som ligner følgende:

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'.

Denne feilen indikerer at én eller flere rader ikke kan konverteres til destinasjonskolonnetypene.

Undersøk feil med MAXERRORS og ERRORFILE

Bruk følgende alternativer for å fortsette inntastingen når antallet radfeiltrinn er under en definert terskel, og for å lagre diagnostiske detaljer på et spesifisert sted.

  • MAXERRORS setter maksimalt antall tolererte radnivåfeil under inntak.
  • ERRORFILE spesifiserer hvor databasen skriver avviste rader og feildetaljer.
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

Konfigurer ERRORFILE under samme lagringssted som brukes for kilde-fil-lesing, ikke i en annen lagringskonto. Identiteten som brukes for å få tilgang til kildedata må også ha tillatelser til å opprette mapper og filer i den konfigurerte feilstien.

Lastoperasjonen lykkes bare når antallet avviste rader er lavere enn MAXERRORS. Når feil fanges opp, skriver inntastingsoperasjonen:

  • error.jsonl for strukturerte diagnostiske tester
  • row.csv for avviste kilderader

Finn og søk i avviste rader

Databasen skriver feilinformasjon til et strukturert mappehierarki under den konfigurerte feilplasseringen. Disse mappene hjelper deg med å spore en spesifikk utførelse og korrelere diagnostikk til én inntakssetning:

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

Bruk OPENROWSET den til å lese inn de strukturerte diagnostikkene error.jsonl slik at du kan identifisere hvilken verdi som feilet, hvilken destinasjonskolonne som ble påvirket, og hvor den feilende raden kom fra:

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

Resultatsettet inkluderer vanligvis én rad per avvist post, for eksempel:

Error Column ColumnName Verdi IsOutputted Fil ErrorRowLocation
Datakonverteringsfeil 1 vendorID vendorID 1 https://.../yellow/tripdata.csv 0
NULL i en ikke-nullbar kolonne 1 vendorID NULL 1 https://.../yellow/ytripdata.csv 399
Datakonverteringsfeil 6 passengerCount Ikke tilgjengelig 1 https://.../yellow/yellow_tripdata.csv 519

Filen error.jsonl inneholder ett JSON-objekt per linje. Hvert objekt inkluderer egenskapene som er listet i tabellen før. Tabellen nedenfor beskriver hver egenskap i detalj.

Column Beskrivelse
Error Gir feilmeldingen som forklarer hvorfor verdien ble avvist under inntasting.
Column Angir indeksen til kolonnen i kilde-CSV-filen som inneholder verdien som ikke kunne importeres. Kolonneindeksering starter ved 1 for den første kolonnen.
ColumnName Spesifiserer navnet på destinasjonstabellkolonnen der verdien ikke kunne lagres.
Value Kildeverdi som ikke kunne konverteres eller valideres.
IsOutputted Indikerer om raden fra kildefilen som inneholder den rapporterte feilen også skrives til den avviste radens utdata (row.csvrow.jsonleller ). En verdi av 1 (eller true i JSONL-filer) betyr at raden er skrevet i error.csv, og en verdi i 0 (eller false i JSONL-filene) betyr at den ikke er det.
File Identifiserer kildefilen som den avviste raden stammer fra. Denne verdien hjelper deg å spore de avviste dataene tilbake til den opprinnelige inndatafilen for undersøkelse.
ErrorRowLocation Byte-offset-posisjon i kildefilen der feilen oppsto.

Anmeldelse av avviste rader

Etter at du har gjennomgått den strukturerte diagnostiske informasjonen, kan du inspisere de opprinnelige kildedataene som databasen ikke kunne ta inn. De avviste radene inneholder kopier av kildepostene, bevart nøyaktig slik de dukket opp i inndatafilene. Diagnostikken for de avviste radene genererer filer som kun inneholder de postene som mislyktes i inntastingen:

  • Hvis du innfører CSV-filer ved å bruke COPY INTO (FILE_TYPE = 'CSV'), inkluderer den avviste utdataen en row.csv fil. Denne filen samsvarer med kildefilstrukturen og inneholder de originale CSV-radene med ugyldige verdier.
  • Hvis du importerer JSONL-filer ved å bruke OPENROWSET(FORMAT = 'JSONL'), inkluderer den avviste utdataen en row.jsonl fil. Denne filen bevarer de opprinnelige JSON-objektene som forårsaket inntastingsfeil.

Bruk disse filene til å validere rotårsaken til feilene, som feilformede verdier, uventede NULL verdier eller headerrader som feiltolket som data.

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

Skjemaet row.csv samsvarer med kildens CSV-form, og det inneholder kun rader som mislyktes ved inntasting.

Eksempel på avviste rad-utdata:

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 Ikke tilgjengelig 1.80 11.00 0.50 15.90

Basert på denne diagnostiske informasjonen kan du identifisere følgende inntaksproblemer:

  • Header-raden i kildefilen blir feilaktig tolket som en datarad. For å løse COPY INTO dette bør uttalelsen bruke alternativet FIRSTROW = 2 .
  • En rad i kildefilen for kolonnen vendorID (C1) inneholder NULL verdier, men den tilsvarende kolonnen i destinasjonstabellen TaxiTrips er definert som NOT NULL.
  • En rad i kildefilen for kolonnen passengerCount inneholder en ugyldig verdi (N/A) som ikke kan konverteres til destinasjonskolonnen int .

Bemerkning

Den samme prosessen gjelder når du undersøker avviste rader fra JSONL-input. Bruk row.jsonl filen til å inspisere de avviste postene.

Fiks inntastingsproblemer og ta inn data på nytt

Etter at du har identifisert årsaken til inntaksfeilene, korriger problemet og importer de berørte dataene på nytt. Utbedringsmetoden avhenger av hvor feilen oppstår.

Fiks destinasjonstabellens skjema

Hvis kildedataene ikke samsvarer med destinasjonstabellens skjema, oppdater tabelldefinisjonen. Vanlige løsninger inkluderer å endre kolonnedatatyper eller fjerne restriktive begrensninger som NOT NULL.

I noen tilfeller kan det hende du må fjerne og lage destinasjonstabellen på nytt før du importerer dataene på nytt.

Korriger kildedata og ta inn filer på nytt

Hvis inntastingen feiler på grunn av ugyldige eller inkonsistente verdier i kildefilene, korriger disse verdiene og innta dataene på nytt. For eksempel, bytt ut plassholderverdier som N/A med tomme verdier eller gyldige standardinnstillinger.

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

Når du tar inn korrigerte data på nytt, bruk en eksplisitt filsti som peker til den nye filen som kun inneholder korrigerte data, i stedet for en mappesti som refererer til de opprinnelige filene. Denne tilnærmingen forhindrer at rader som tidligere ble lastet inn på nytt, og unngår dupliserte data.

Behandle avviste rader på nytt ved å bruke en staging-tabell

Du kan laste inn avviste rader i en staging-tabell, fikse dataene ved å bruke Transact-SQL dataendringssetninger, og deretter importere de korrigerte radene på nytt.

Følgende CREATE TABLE AS SELECT setning laster avviste rader inn i en tabell for videre behandling:

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

Etter at du har korrigert dataene, sett inn de rensede radene i destinasjonstabellen.