Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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.
I din lagerarbetsyta, öppna ditt lager.
På fliken Start väljer du Ny SQL-fråga.
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.
-
MAXERRORSanger det maximala antalet tolererade fel på radnivå under inmatningen. -
ERRORFILEanger 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.jsonlför strukturerad diagnostik -
row.csvfö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 enrow.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 enrow.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 INTOanvända alternativetFIRSTROW = 2. - En rad i källfilen för
vendorIDkolumnen (C1) innehållerNULLvärden, men motsvarande kolumn i måltabellenTaxiTripsdefinieras somNOT NULL. - En rad i källfilen för
passengerCountkolumnen 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.