Felsöka Transact-SQL inmatningsfel med felfiler

gäller för:✅ Warehouse i Microsoft Fabric

Den här artikeln beskriver hur du felsöker inmatningsfel i T-SQL-inmatningsmönster.

Inmatning till ett lager med hjälp av COPY INTO, BULK INSERT, OPENROWSET funktioner i CTAS, INSERT, UPDATE och MERGE -instruktioner kan misslyckas av flera orsaker. Källfilvärdena kanske inte matchar tabellschemat. Nödvändiga värden kanske saknas. Inmatningsalternativ kan också vara felkonfigurerade.

Den här felsökningsguiden använder diagnostikinformationen för avvisade rader för att lösa fel, samla in fel på radnivå och inspektera avvisade rader med felmetadata.

Genom att undersöka felfilerna som genereras av COPY INTO och andra inmatningskommandon kan du hitta exakt vilka rader som inte kunde matas in och varför. Den här informationen hjälper dig att identifiera datakvalitetsproblem eller justera inmatningsinställningar, åtgärda källdata och köra belastningen igen med säkerhet.

Viktigt!

De här instruktionerna gäller endast för att mata in CSV- eller JSONL-filer med hjälp av Transact-SQL kommandon (COPY INTO, BULK INSERToch DML med OPENROWSET funktion). Avvisade raders utdatafiler genereras inte för externa inmatningsverktyg (till exempel pipelines ), Parquet-filer eller vid inmatning av data från SQL-analysslutpunkten.

Skapa måltabellen

Innan du kör inmatningskommandon skapar du en måltabell med strikta typer och NOT NULL begränsningar så att du tidigt kan identifiera problem med konvertering och datakvalitet.

  1. I din lagerarbetsyta, öppna ditt lager.

  2. På fliken Start väljer du Ny SQL-fråga.

    Skärmbild av det översta avsnittet på användarens arbetsyta som visar knappen Ny SQL-fråga.

  3. Kör följande kommando:

    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 använda flera metoder som stöds, inklusive inmatning med COPY INTO eller inmatning med Transact-SQL. Välj den inmatningsmetod som bäst passar dina krav för datakälla, format och automatisering. I följande COPY INTO-exempel visas ett vanligt inmatningsmönster för inläsning av data från externa filer till en tabell.

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

Den här instruktionen kan inte mata in data om källfilerna inte matchar måltabellschemat. Vanliga orsaker är felmatchade kolumnantal, inkompatibla datatyper eller värden som inte kan lagras i måltabellen. Om inmatning påträffar värden som inte kan konverteras till målschemat returnerar instruktionen ett fel som liknar följande:

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

Det här felet anger att en eller flera rader inte kan konverteras till målkolumntyperna.

Undersöka fel med MAXERRORS och ERRORFILE

Använd följande alternativ för att fortsätta inmatningen när antalet fel på radnivå ligger under ett definierat tröskelvärde och för att lagra diagnostikinformation på en angiven plats.

  • MAXERRORS anger det maximala antalet tolererade fel på radnivå under inmatningen.
  • ERRORFILE anger var databasen skriver avvisade rader och felinformation.
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/'
);

Viktigt!

Konfigurera ERRORFILE under samma lagringsplats som används för källfilläsningar, inte i ett annat lagringskonto. Identiteten som används för att komma åt källdata måste också ha behörighet att skapa mappar och filer i den konfigurerade felsökvägen.

Inläsningsåtgärden lyckas bara när antalet avvisade rader är lägre än MAXERRORS. När fel registreras skriver inmatningsåtgärden:

  • error.jsonl för strukturerad diagnostik
  • row.csv för avvisade källrader

Leta upp och analysera avvisade rader

Databasen skriver felinformation till en strukturerad mapphierarki under den konfigurerade felplatsen. De här mapparna hjälper dig att spåra en specifik körning och korrelera diagnostik till en inmatningsinstruktion:

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

Använd OPENROWSET för att läsa den strukturerade diagnostiken i error.jsonl så att du kan identifiera vilket värde som misslyckades, vilken målkolumn som påverkades och var den misslyckade raden har sitt ursprung:

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

Resultatuppsättningen innehåller vanligtvis en rad per avvisad post, till exempel:

Error Column ColumnName Value IsOutputted File ErrorRadPlats
Datakonverteringsfel 1 vendorID vendorID 1 https://.../yellow/tripdata.csv 0
NULL i icke-nullbar kolumn 1 vendorID NOLL 1 https://.../yellow/ytripdata.csv 399
Datakonverteringsfel 6 passengerCount N/A 1 https://.../yellow/yellow_tripdata.csv 519

Filen error.jsonl innehåller ett JSON-objekt per rad. Varje objekt innehåller de egenskaper som anges i föregående tabell. I följande tabell beskrivs varje egenskap i detalj.

Column Description
Error Innehåller felmeddelandet som förklarar varför värdet avvisades under inmatningen.
Column Anger indexet för kolumnen i CSV-källfilen som innehåller det värde som inte kunde matas in. Kolumnindexering börjar vid 1 för den första kolumnen.
ColumnName Anger namnet på måltabellkolumnen där värdet inte kunde lagras.
Value Källvärde som inte kunde konverteras eller verifieras.
IsOutputted Anger om raden från källfilen som innehåller det rapporterade felet också skrivs till utdatafilen för avvisade rader (row.csv eller row.jsonl). 1 Värdet (eller true i JSONL-filer) innebär att raden skrivs i error.csv, och värdet 0 (eller false i JSONL-filerna) innebär att den inte är det.
File Identifierar källfilen som den avvisade raden kommer från. Det här värdet hjälper dig att spåra avvisade data tillbaka till den ursprungliga indatafilen för undersökning.
ErrorRowLocation Byteförskjutningsposition i källfilen där felet inträffade.

Granska avvisade rader

När du har granskat den strukturerade diagnostikinformationen kan du kontrollera de ursprungliga källdata som databasen inte kunde mata in. De avvisade utdataraderna innehåller kopior av källposterna, bevarade exakt som de förekom i inputfilerna. Diagnostiken för avvisade rader genererar filer som endast innehåller de poster som misslyckades med inmatning:

  • Om du matar in CSV-filer med hjälp av COPY INTO (FILE_TYPE = 'CSV'), innehåller de avvisade utdata en row.csv-fil. Den här filen matchar källfilstrukturen och innehåller de ursprungliga CSV-raderna med ogiltiga värden.
  • Om du matar in JSONL-filer med hjälp av OPENROWSET(FORMAT = 'JSONL'), innehåller de avvisade utdata en row.jsonlfil. Den här filen bevarar de ursprungliga JSON-objekten som orsakade inmatningsfel.

Använd dessa filer för att verifiera rotorsaken till felen, till exempel felaktiga värden, oväntade NULL värden eller rubrikrader som felaktigt parsats som data.

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

Schemat row.csv matchar CSV-källformen och innehåller endast rader som inte kunde matas in.

Exempel på avvisade radutdata:

C1 C2 C3 C4 C5 C6 C7 C8 C9 C10
vendorID startLat startLon endLat endLon passengerCount tripDistance fareAmount mtaTax totalAmount
NOLL 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

Baserat på den här diagnostikinformationen kan du identifiera följande inmatningsproblem:

  • Rubrikraden i källfilen parsas av misstag som en datarad. För att lösa detta bör -instruktionen COPY INTO använda alternativet FIRSTROW = 2 .
  • En rad i källfilen för vendorID kolumnen (C1) innehåller NULL värden, men motsvarande kolumn i måltabellen TaxiTrips definieras som NOT NULL.
  • En rad i källfilen för passengerCount kolumnen innehåller ett ogiltigt värde (N/A) som inte kan konverteras till målkolumnen int .

Note

Samma process gäller när du undersöker avvisade rader från JSONL-indata. Använd row.jsonl-filen för att granska de avvisade posterna.

Åtgärda inmatningsproblem och mata in data igen

När du har identifierat orsaken till inmatningsfel korrigerar du problemet och matar in de berörda data igen. Reparationsmetoden beror på var felet kommer ifrån.

Korrigera måltabellens schema

Om källdata inte överensstämmer med måltabellschemat uppdaterar du tabelldefinitionen. Vanliga korrigeringar är att ändra kolumndatatyper eller ta bort restriktiva begränsningar, till exempel NOT NULL.

I vissa scenarier kan du behöva ta bort och återskapa destinationstabellen innan du matar in data igen.

Korrigera källdata och mata in filer igen

Om inmatningen misslyckas på grund av ogiltiga eller inkonsekventa värden i källfilerna korrigerar du dessa värden och matar in data igen. Ersätt till exempel platshållarvärden, till exempel N/A med tomma värden eller giltiga standardvärden.

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

När korrigerade data matas in igen använder du en explicit filsökväg som pekar på den nya filen som endast innehåller korrigerade data i stället för en mappsökväg som refererar till de ursprungliga filerna. Den här metoden förhindrar återinmatning av rader som tidigare har lästs in och undviker dubbletter av data.

Bearbeta avvisade rader med hjälp av en mellanlagringstabell

Du kan läsa in avvisade rader i en mellanlagringstabell, åtgärda data med hjälp av Transact-SQL datamodifieringsinstruktioner och sedan mata in de korrigerade raderna igen.

Följande CREATE TABLE AS SELECT instruktion läser in avvisade rader i en tabell för vidare bearbetning:

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 korrigerat data infogar du de rensade raderna i måltabellen.