Fejlsøg Transact-SQL indlæsningsfejl med fejlfiler

Gælder for:✅ Warehouse i Microsoft Fabric

Denne artikel beskriver, hvordan man fejlsøger indlæsningsfejl i T-SQL-indlæsningsmønstre.

Indlæsning i et lager ved brug af COPY INTO, BULK INSERT, funktion OPENROWSET i CTAS, INSERT, UPDATE, og -sætninger MERGE kan fejle af flere årsager. Kildefilværdier kan muligvis ikke matche tabellens skema. Nødvendige værdier kan mangle. Indtagelsesmuligheder kan også være forkert konfigureret.

Denne fejlfinding guide bruger diagnostiske oplysninger om afviste rækker til at løse fejl, fange fejl på rækkeniveau og inspicere afviste rækker med fejlmetadata.

Ved at undersøge fejlfilerne, der genereres af COPY INTO og andre indtastningskommandoer, kan du præcist fastslå, hvilke rækker der ikke blev indlæst, og hvorfor. Disse oplysninger hjælper dig med at identificere datakvalitetsproblemer eller justere indtagelsesindstillinger, rette kildedataene og køre belastningen igen med sikkerhed.

Vigtigt!

Disse instruktioner gælder kun for at indlæse CSV- eller JSONL-filer ved at bruge Transact-SQL kommandoer (COPY INTO, BULK INSERT, og DML med OPENROWSET funktion). Outputfiler til afviste rækker genereres ikke til eksterne inputværktøjer (såsom pipelines ), Parquet-filer eller ved indlæsning af data fra SQL analytics-endpoint.

Opret måltabellen

Før du kører indlæsningskommandoer, skal du oprette en destinationstabel med strenge typer og NOT NULL begrænsninger, så du tidligt opdager konverterings- og datakvalitetsproblemer.

  1. Åbn dit lager-arbejdsområde i dit lager.

  2. fanen Hjem vælger du Ny SQL-forespørgsel.

    Skærmbillede af den øverste del af brugerens arbejdsområde, der viser knappen Ny SQL-forespørgsel.

  3. Kør følgende sætning:

    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 bruge flere understøttede metoder, herunder at indlæse med COPY INTO eller at indlæse med Transact-SQL. Vælg den indtagelsesmetode, der bedst passer til dine krav til datakilde, format og automatisering. Følgende COPY INTO-eksempel illustrerer et almindeligt indlæsningsmønster til indlæsning af data fra eksterne filer i en tabel.

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

Denne sætning kan fejle i at indtage data, hvis kildefilerne ikke matcher destinationstabellens skema. Almindelige årsager inkluderer uoverensstemmende kolonneantal, inkompatible datatyper eller værdier, der ikke kan gemmes i måltabellen. Hvis indlæsning støder på værdier, der ikke kan konverteres til destinationsskemaet, returnerer sætningen en fejl, der 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 fejl indikerer, at en eller flere rækker ikke kan konverteres til destinationskolonnetyperne.

Undersøg fejl med MAXERRORS og ERRORFILE

Brug følgende muligheder til at fortsætte indlæsningen, når antallet af fejl på rækkeniveau er under en defineret tærskel, og for at gemme diagnostiske detaljer et angivet sted.

  • MAXERRORS fastsætter det maksimale antal tolererede rækkeniveaufejl under indtagelse.
  • ERRORFILE angiver, hvor databasen skriver afviste rækker og fejldetaljer.
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/'
);

Vigtigt!

Konfigurer ERRORFILE under samme lagringsplacering, som bruges til kilde-fil-læsninger, ikke i en anden lagringskonto. Identiteten, der bruges til at tilgå kildedata, skal også have tilladelser til at oprette mapper og filer i den konfigurerede fejlsti.

Belastningsoperationen lykkes kun, når antallet af afviste rækker er lavere end MAXERRORS. Når fejl opfanges, skriver indlæsningsoperationen:

  • error.jsonl for strukturerede diagnostiske metoder
  • row.csv for afviste kilde-rækker

Find og forespørg afviste rækker

Databasen skriver fejlinformation til et struktureret mappehierarki under den konfigurerede fejlplacering. Disse mapper hjælper dig med at spore en specifik udførelse og korrelere diagnostik til én indlæsningssætning:

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

Brug OPENROWSET den til at læse de strukturerede diagnostiske linjer ind error.jsonl , så du kan identificere, hvilken værdi der fejlede, hvilken destinationskolonne der blev påvirket, og hvor den fejlende række stammer fra:

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

Resultatsættet indeholder typisk én række pr. afvist post, for eksempel:

Fejl Column Kolonnenavn Værdi IsOutputted Fil ErrorRowLocation
Datakonverteringsfejl 1 vendorID vendorID 1 https://.../yellow/tripdata.csv 0
NULL i ikke-nullbar kolonne 1 vendorID NUL 1 https://.../yellow/ytripdata.csv 399
Datakonverteringsfejl 6 passengerCount Ikke tilgængelig 1 https://.../yellow/yellow_tripdata.csv 519

Filen error.jsonl indeholder ét JSON-objekt pr. linje. Hvert objekt indeholder de egenskaber, der er angivet i den foregående tabel. Følgende tabel beskriver hver egenskab i detaljer.

Column Beskrivelse
Error Giver fejlmeddelelsen, der forklarer, hvorfor værdien blev afvist under indlæsning.
Column Angiver indekset for kolonnen i kilde-CSV-filen, der indeholder værdien, som ikke kunne indlæses. Kolonneindeksering starter ved for 1 den første kolonne.
ColumnName Angiver navnet på den kolonne i destinationstabellen, hvor værdien ikke kunne gemmes.
Value Kildeværdi, der ikke kunne konverteres eller valideres.
IsOutputted Angiver om rækken fra kildefilen, der indeholder den rapporterede fejl, også skrives til outputfilen for de afviste rækker (row.csvrow.jsonleller ). En værdi af 1 (eller true i JSONL-filer) betyder, at rækken er skrevet i error.csv, og en værdi af 0 (eller false i JSONL-filerne) betyder, at den ikke er det.
File Identificerer kildefilen, hvorfra den afviste række stammer. Denne værdi hjælper dig med at spore de afviste data tilbage til den oprindelige inputfil til undersøgelse.
ErrorRowLocation Byte-offset-positionen i kildefilen, hvor fejlen opstod.

Anmeldelse af afviste rækker

Efter du har gennemgået de strukturerede diagnostiske oplysninger, kan du inspicere de oprindelige kildedata, som databasen ikke kunne indlæse. De afviste rækker indeholder kopier af kildeposterne, bevaret præcis, som de fremstod i inputfilerne. Diagnostikken for afviste rækker genererer filer, der kun indeholder de poster, der fejlede indtastningen:

  • Hvis du indlæser CSV-filer ved at bruge COPY INTO (FILE_TYPE = 'CSV'), indeholder det afviste output en row.csv fil. Denne fil matcher kildefilstrukturen og indeholder de oprindelige CSV-rækker med ugyldige værdier.
  • Hvis du indlæser JSONL-filer ved at bruge OPENROWSET(FORMAT = 'JSONL'), indeholder det afviste output en row.jsonl fil. Denne fil bevarer de oprindelige JSON-objekter, der forårsagede indtastningsfejl.

Brug disse filer til at validere rodårsagen til fejlene, såsom fejldannede værdier, uventede NULL værdier eller header-rækker, der fejlagtigt blev parset som data.

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

Skemaet row.csv matcher kildens CSV-form, og det indeholder kun rækker, der fejlede indtastning.

Eksempel på output med afviste rækker:

C1 C2 C3 C4 C5 C6 C7 C8 C9 C10
vendorID startLat startLon endLat endLon passengerCount tripDistance fareAmount mtaTax totalAmount
NUL 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 tilgængelig 1.80 11.00 0.50 15.90

Baseret på disse diagnostiske oplysninger kan du identificere følgende indtagelsesproblemer:

  • Header-rækken i kildefilen bliver fejlagtigt parset som en datarække. For at løse COPY INTO det bør udtoget bruge muligheden FIRSTROW = 2 .
  • En række i kildefilen for kolonnen vendorID (C1) indeholder NULL værdier, men den tilsvarende kolonne i destinationstabellen TaxiTrips er defineret som NOT NULL.
  • En række i kildefilen for kolonnen passengerCount indeholder en ugyldig værdi (N/A), som ikke kan konverteres til destinationskolonnen int .

Bemærkning

Den samme proces gælder, når du undersøger afviste rækker fra JSONL-input. Brug row.jsonl filen til at inspicere de afviste poster.

Ret indtastningsproblemer og genindtast data

Når du har identificeret årsagen til indtagelsesfejl, skal du rette problemet og genindsamle de berørte data. Udbedringsmetoden afhænger af, hvor fejlen opstår.

Ret destinationstabellens skema

Hvis kildedataene ikke overholder skemaet for destinationstabellen, skal tabeldefinitionen opdateres. Almindelige rettelser inkluderer ændring af kolonnedatatyper eller fjernelse af restriktive begrænsninger såsom NOT NULL.

I nogle scenarier kan det være nødvendigt at fjerne og genskabe destinationstabellen, før du genindlæser dataene.

Korrekt kildedata og genindtast filer

Hvis indlæsningen fejler på grund af ugyldige eller inkonsistente værdier i kildefilerne, skal du rette disse værdier og genindtage dataene. For eksempel kan du erstatte pladsholderværdier som for eksempel N/A med tomme værdier eller gyldige standardindstillinger.

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

Når du genindtager korrigerede data, brug en eksplicit filsti, der peger til den nye fil, der kun indeholder korrigerede data, i stedet for en mappesti, der refererer til de oprindelige filer. Denne tilgang forhindrer genindlæsning af rækker, der tidligere er blevet indlæst med succes, og undgår duplikerede data.

Genbearbejder afviste rækker ved at bruge en staging-tabel

Du kan indlæse afviste rækker i en staging-tabel, rette dataene ved at bruge Transact-SQL dataændringssætninger og derefter genindlæse de korrigerede rækker.

Følgende CREATE TABLE AS SELECT udsagn indlæser afviste rækker i en tabel til videre behandling:

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

Når du har rettet dataene, indsæt de rensede rækker i destinationstabellen.