Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:✅ Warehouse in Microsoft Fabric
In dit artikel wordt beschreven hoe u opnamefouten in T-SQL-opnamepatronen oplost.
Opname in een magazijn met behulp van COPY INTO, BULK INSERT, OPENROWSET functie in CTAS, INSERT, UPDATE en MERGE instructies kan om verschillende redenen mislukken. Bronbestandswaarden komen mogelijk niet overeen met het tabelschema. Vereiste waarden ontbreken mogelijk. Opnameopties kunnen ook onjuist zijn geconfigureerd.
In deze gids voor probleemoplossing worden de diagnostische gegevens voor geweigerde rijen gebruikt om fouten op te lossen, fouten op rijniveau vast te leggen en geweigerde rijen met foutmetagegevens te inspecteren.
Door de foutbestanden te onderzoeken die zijn gegenereerd door COPY INTO en andere opnameopdrachten, kunt u precies bepalen welke rijen niet kunnen worden opgenomen en waarom. Deze informatie helpt u bij het identificeren van problemen met de gegevenskwaliteit, het aanpassen van de importinstellingen, het oplossen van de brongegevens en het proces opnieuw uitvoeren met vertrouwen.
Important
Deze instructies zijn alleen van toepassing op het opnemen van CSV- of JSONL-bestanden met behulp van Transact-SQL opdrachten (COPY INTOBULK INSERTen DML met OPENROWSET functie). Uitvoerbestanden voor geweigerde rijen worden niet gegenereerd voor externe opnamehulpprogramma's (zoals pijplijnen ), Parquet-bestanden of bij het opnemen van gegevens van het SQL-analyse-eindpunt.
Maak de doeltabel
Voordat u opnameopdrachten uitvoert, maakt u een doeltabel met strikte typen en NOT NULL beperkingen, zodat u vroeg conversie- en gegevenskwaliteitsproblemen kunt ondervangen.
Open uw magazijn in uw magazijnwerkruimte.
Selecteer op het tabblad Startde optie Nieuwe SQL-query.
Voer de volgende instructie uit:
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 );
U kunt meerdere ondersteunde methoden gebruiken, waaronder opnemen met COPY INTO of opnemen met Transact-SQL. Kies de opnamemethode die het beste past bij uw gegevensbron, indeling en automatiseringsvereisten. Het volgende COPY INTO-voorbeeld illustreert een gemeenschappelijk opnamepatroon voor het laden van gegevens uit externe bestanden in een tabel.
COPY INTO [dbo].[TaxiTrips]
FROM 'https://{storage-path}.blob.core.windows.net/Files/yellow/'
WITH ( FILE_TYPE = 'CSV' );
Deze instructie kan geen gegevens opnemen als de bronbestanden niet overeenkomen met het doeltabelschema. Veelvoorkomende oorzaken zijn niet-overeenkomende kolomaantallen, incompatibele gegevenstypen of waarden die niet kunnen worden opgeslagen in de doeltabel. Als de opname waarden tegenkomt die niet kunnen worden geconverteerd naar het doelschema, retourneert de instructie een fout die vergelijkbaar is met de volgende:
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'.
Deze fout geeft aan dat een of meer rijen niet kunnen worden geconverteerd naar de doelkolomtypen.
Fouten onderzoeken met MAXERRORS en ERRORFILE
Gebruik de volgende opties om door te gaan met opnemen wanneer het aantal fouten op rijniveau onder een gedefinieerde drempelwaarde ligt en diagnostische gegevens op een opgegeven locatie wilt opslaan.
-
MAXERRORSstelt het maximum aantal getolereerde fouten op rijniveau in tijdens opname. -
ERRORFILEgeeft aan waar de database geweigerde rijen en foutdetails schrijft.
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
Configureer ERRORFILE onder dezelfde opslaglocatie die wordt gebruikt voor leesbewerkingen van bronbestanden, niet in een ander opslagaccount. De identiteit die wordt gebruikt voor toegang tot brongegevens, moet ook machtigingen hebben voor het maken van mappen en bestanden in het geconfigureerde foutpad.
De laadbewerking slaagt alleen wanneer het aantal geweigerde rijen lager is dan MAXERRORS. Wanneer fouten worden vastgelegd, schrijft de opnamebewerking het volgende:
-
error.jsonlvoor gestructureerde diagnostische gegevens -
row.csvvoor geweigerde bronrijen
Geweigerde rijen zoeken en er query's op uitvoeren
De database schrijft foutinformatie naar een gestructureerde maphiërarchie onder de geconfigureerde foutlocatie. Met deze mappen traceer je een specifiek uitvoeringsproces en correleer je diagnostische gegevens met één invoeropdracht.
ERRORFILE/
+-- _rejectedrows/
+-- <timestamp>/
+-- <statement_id>/
+-- error.jsonl
+-- row.csv or rows.jsonl
Gebruik OPENROWSET om de gestructureerde diagnostische gegevens in error.jsonl te lezen, zodat u kunt vaststellen welke waarde is mislukt, welke doelkolom is beïnvloed en waar de mislukte rij vandaan komt.
SELECT *
FROM OPENROWSET(
BULK 'https://{storage-path}.blob.core.windows.net/Files/yellow/_rejectedrows/*/*/error.jsonl'
);
De resultatenset bevat doorgaans één rij per geweigerde record, bijvoorbeeld:
| Fout | Kolom | ColumnName | Value | WordtUitgevoerd | Bestand | ErrorRowLocation |
|---|---|---|---|---|---|---|
| Fout bij gegevensconversie | 1 | vendorID |
vendorID |
1 | https://.../yellow/tripdata.csv |
0 |
| NULL in een niet-nullbare kolom | 1 | vendorID |
NUL | 1 | https://.../yellow/ytripdata.csv |
399 |
| Fout bij gegevensconversie | 6 | passengerCount |
N/A | 1 | https://.../yellow/yellow_tripdata.csv |
519 |
Het error.jsonl bestand bevat één JSON-object per regel. Elk object bevat de eigenschappen die in de voorgaande tabel worden vermeld. In de volgende tabel worden alle eigenschappen gedetailleerd beschreven.
| Kolom | Description |
|---|---|
Error |
Hier wordt het foutbericht weergegeven waarin wordt uitgelegd waarom de waarde is geweigerd tijdens de opname. |
Column |
Hiermee geeft u de index van de kolom in het CSV-bronbestand die de waarde bevat die niet kan worden opgenomen. Kolomindexering begint bij 1 de eerste kolom. |
ColumnName |
Hiermee geeft u de naam van de doeltabelkolom waarin de waarde niet kan worden opgeslagen. |
Value |
Bronwaarde die niet kan worden geconverteerd of gevalideerd. |
IsOutputted |
Hiermee wordt aangegeven of de rij uit het bronbestand met de gemelde fout ook naar het uitvoerbestand voor geweigerde rijen (row.csv of row.jsonl) wordt geschreven. Een waarde van 1 (of true in JSONL-bestanden) betekent dat de rij is geschreven in error.csven een waarde van 0 (of false in de JSONL-bestanden) betekent dit niet. |
File |
Identificeert het bronbestand waaruit de geweigerde rij afkomstig is. Deze waarde helpt u bij het traceren van de geweigerde gegevens naar het oorspronkelijke invoerbestand voor onderzoek. |
ErrorRowLocation |
Byte-offsetpositie in het bronbestand waar de fout is opgetreden. |
Geweigerde rijen controleren
Nadat u de gestructureerde diagnostische gegevens hebt bekeken, kunt u de oorspronkelijke brongegevens inspecteren die de database niet kon opnemen. De uitvoer van geweigerde rijen bevat kopieën van de bronrecords, die exact behouden blijven zoals ze in de invoerbestanden worden weergegeven. De diagnostiek voor geweigerde rijen genereert bestanden die alleen de records bevatten die niet zijn ingevoerd.
- Als u CSV-bestanden opneemt met behulp van
COPY INTO (FILE_TYPE = 'CSV'), bevat de geweigerde uitvoer eenrow.csvbestand. Dit bestand komt overeen met de bronbestandsstructuur en bevat de oorspronkelijke CSV-rijen met ongeldige waarden. - Als u JSONL-bestanden opneemt met behulp van
OPENROWSET(FORMAT = 'JSONL'), bevat de geweigerde uitvoer eenrow.jsonlbestand. Dit bestand behoudt de oorspronkelijke JSON-objecten die opnamefouten hebben veroorzaakt.
Gebruik deze bestanden om de hoofdoorzaak van de fouten te valideren, zoals onjuiste waarden, onverwachte NULL waarden of veldnamenrijen die onjuist zijn geparseerd als gegevens.
SELECT *
FROM OPENROWSET(
BULK 'https://{storage-path}.blob.core.windows.net/Files/yellow/_rejectedrows/*/*/row.csv'
);
Het row.csv schema komt overeen met de csv-bronshape en bevat alleen rijen waarvoor de opname is mislukt.
Voorbeeld van uitvoer voor geweigerde rijen:
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 | N/A | 1.80 | 11.00 | 0,50 | 15.90 |
Op basis van deze diagnostische gegevens kunt u de volgende opnameproblemen identificeren:
- De koprij in het bronbestand wordt per ongeluk als gegevensrij geparsed. Om dit op te lossen, moet de
COPY INTOinstructie deFIRSTROW = 2optie gebruiken. - Een rij in het bronbestand voor de
vendorIDkolom (C1) bevatNULLwaarden, maar de bijbehorende kolom in de doeltabelTaxiTripswordt gedefinieerd alsNOT NULL. - Een rij in het bronbestand voor de
passengerCountkolom bevat een ongeldige waarde (N/A) die niet kan worden geconverteerd naar de doelkolom int .
Note
Hetzelfde proces geldt wanneer u geweigerde rijen van JSONL-invoer bekijkt. Gebruik het row.jsonl bestand om de geweigerde records te controleren.
Opnameproblemen oplossen en gegevens opnieuw opnemen
Nadat u de oorzaak van opnamefouten hebt geïdentificeerd, corrigeert u het probleem en neemt u de betrokken gegevens opnieuw op. De herstelbenadering is afhankelijk van waar de fout vandaan komt.
Herstel het schema van de doeltabel
Als de brongegevens niet voldoen aan het doeltabelschema, werkt u de tabeldefinitie bij. Veelvoorkomende oplossingen zijn het wijzigen van kolomgegevenstypen of het verwijderen van beperkende beperkingen, zoals NOT NULL.
In sommige scenario's moet u mogelijk de doeltabel verwijderen en opnieuw creëren voordat u de gegevens opnieuw opneemt.
Brongegevens corrigeren en bestanden opnieuw opnemen
Als de opname mislukt vanwege ongeldige of inconsistente waarden in de bronbestanden, corrigeert u deze waarden en neemt u de gegevens opnieuw op. Vervang bijvoorbeeld tijdelijke aanduidingen, zoals N/A, door lege waarden of geldige standaardwaarden.
COPY INTO [dbo].[TaxiTrips]
FROM 'https://{storage-path}.blob.core.windows.net/Files/yellow/tripdata_corrected.csv'
WITH ( FILE_TYPE = 'CSV' );
Wanneer u gecorrigeerde gegevens opnieuw opneemt, gebruikt u een expliciet bestandspad dat verwijst naar het nieuwe bestand dat alleen gecorrigeerde gegevens bevat, in plaats van een mappad dat verwijst naar de oorspronkelijke bestanden. Met deze methode voorkomt u dat rijen die eerder zijn geladen, opnieuw worden opgenomen en dubbele gegevens worden voorkomen.
Geweigerde rijen opnieuw verwerken met behulp van een faseringstabel
U kunt geweigerde rijen laden in een faseringstabel, de gegevens herstellen met behulp van Transact-SQL instructies voor het wijzigen van gegevens en vervolgens de gecorrigeerde rijen opnieuw opnemen.
Met de volgende CREATE TABLE AS SELECT instructie worden geweigerde rijen in een tabel geladen voor verdere verwerking:
CREATE TABLE TaxiTrip_RejectedRows AS
SELECT *
FROM OPENROWSET(
BULK 'https://{storage-path}.blob.core.windows.net/Files/yellow/_rejectedrows/*/*/row.csv'
);
Nadat u de gegevens hebt gecorrigeerd, voegt u de opgeschoonde rijen in de doeltabel in.