Risolvere gli errori di ingestione Transact-SQL con i file di errore

si applica a:✅ Magazzino di dati in Microsoft Fabric

Questo articolo descrive come risolvere gli errori di inserimento nei modelli di inserimento T-SQL.

L'inserimento in un magazzino tramite le funzioni COPY INTO, BULK INSERT, OPENROWSET e le istruzioni CTAS, INSERT, UPDATE e MERGE può fallire per diversi motivi. I valori dei file di origine potrebbero non corrispondere allo schema della tabella. I valori obbligatori potrebbero non essere presenti. Le opzioni di inserimento potrebbero anche essere configurate in modo errato.

Questa guida alla risoluzione dei problemi usa le informazioni di diagnostica delle righe rifiutate per risolvere gli errori, acquisire errori a livello di riga ed esaminare le righe rifiutate con metadati di errore.

Esaminando i file di errore generati da COPY INTO e altri comandi di inserimento, è possibile individuare esattamente quali righe non sono riuscite a inserire e perché. Queste informazioni consentono di identificare i problemi di qualità dei dati o di regolare le impostazioni di inserimento, correggere i dati di origine ed eseguire di nuovo il carico con sicurezza.

Importante

Queste istruzioni si applicano solo all'inserimento di file CSV o JSONL usando i comandi Transact-SQL (COPY INTO, BULK INSERTe DML con OPENROWSET funzione). I file di output delle righe rifiutate non vengono generati per strumenti di ingestione esterni (ad esempio pipeline), o per file Parquet e quando si ingestono dati da endpoint di analisi SQL.

Creare la tabella di destinazione

Prima di eseguire i comandi di inserimento, creare una tabella di destinazione con tipi e NOT NULL vincoli rigorosi in modo da intercettare tempestivamente i problemi di conversione e qualità dei dati.

  1. Nell'area di lavoro del tuo magazzino, apri il magazzino.

  2. Nella scheda Home selezionare Nuova query SQL.

    Screenshot della sezione superiore dell'area di lavoro dell'utente che mostra il pulsante Nuova query SQL.

  3. Eseguire l'istruzione seguente:

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

È possibile usare più metodi supportati, tra cui l'inserimento con COPY INTO o l'inserimento con Transact-SQL. Scegliere il metodo di inserimento più adatto ai requisiti di origine dati, formato e automazione. Nell'esempio COPY INTO seguente viene illustrato un modello di inserimento comune per il caricamento di dati da file esterni in una tabella.

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

Questa istruzione può non riuscire ad inserire dati se i file di origine non corrispondono allo schema della tabella di destinazione. Le cause comuni includono conteggi di colonne non corrispondenti, tipi di dati incompatibili o valori che non possono essere archiviati nella tabella di destinazione. Se l'inserimento rileva valori che non possono essere convertiti nello schema di destinazione, l'istruzione restituisce un errore simile al seguente:

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

Questo errore indica che una o più righe non possono essere convertite nei tipi di colonna di destinazione.

Analizzare gli errori con MAXERRORS e ERRORFILE

Usare le opzioni seguenti per continuare l'inserimento quando il numero di errori a livello di riga è inferiore a una soglia definita e per archiviare i dettagli di diagnostica in una posizione specificata.

  • MAXERRORS imposta il numero massimo di errori a livello di riga tollerati durante l'inserimento.
  • ERRORFILE specifica dove il database scrive le righe rifiutate e i dettagli dell'errore.
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/'
);

Importante

"La configurazione di ERRORFILE deve avvenire nella stessa posizione di archiviazione usata per le letture dei file di origine, e non in un account di archiviazione diverso." L'identità usata per accedere ai dati di origine deve disporre anche delle autorizzazioni per creare cartelle e file nel percorso di errore configurato.

L'operazione di caricamento ha esito positivo solo quando il numero di righe rifiutate è inferiore a MAXERRORS. Quando vengono acquisiti errori, l'operazione di inserimento scrive:

  • error.jsonl per la diagnostica strutturata
  • row.csv per le righe di origine rifiutate

Individuare e interrogare le righe scartate

Il database scrive le informazioni sugli errori in una gerarchia di cartelle strutturata nel percorso configurato per gli errori. Queste cartelle consentono di tracciare un'esecuzione specifica e correlare la diagnostica a un'istruzione di inserimento:

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

Usare OPENROWSET per leggere la diagnostica strutturata in error.jsonl in modo da identificare il valore non riuscito, la colonna di destinazione interessata e la posizione in cui ha avuto origine la riga con errori:

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

Il set di risultati include in genere una riga per ogni record rifiutato, ad esempio:

Error colonna ColumnName Value IsOutputted File ErrorRowLocation
Errore di conversione dei dati 1 vendorID vendorID 1 https://.../yellow/tripdata.csv 0
NULL nella colonna non annullabile 1 vendorID NULLO 1 https://.../yellow/ytripdata.csv 399
Errore di conversione dei dati 6 passengerCount N/A 1 https://.../yellow/yellow_tripdata.csv 519

Il error.jsonl file contiene un oggetto JSON per riga. Ogni oggetto include le proprietà elencate nella tabella precedente. Nella tabella seguente vengono descritte in dettaglio ogni proprietà.

colonna Description
Error Fornisce il messaggio di errore che spiega perché il valore è stato rifiutato durante l'inserimento.
Column Specifica l'indice della colonna nel file CSV di origine che contiene il valore che non è stato possibile inserire. L'indicizzazione delle colonne inizia da 1 per la prima colonna.
ColumnName Specifica il nome della colonna della tabella di destinazione in cui non è stato possibile archiviare il valore.
Value Valore di origine che non è stato possibile convertire o convalidare.
IsOutputted Indica se la riga del file di origine contenente l'errore segnalato viene scritta anche nel file di output delle righe rifiutate (row.csv o row.jsonl). Un valore ( 1 o true nei file JSONL) indica che la riga viene scritta in error.csve un valore ( 0 o false nei file JSONL) significa che non lo è.
File Identifica il file di origine da cui ha avuto origine la riga rifiutata. Questo valore consente di tracciare i dati rifiutati nel file di input originale per l'analisi.
ErrorRowLocation Posizione di offset dei byte nel file di origine in cui si è verificato l'errore.

Esaminare le righe rifiutate

Dopo aver esaminato le informazioni di diagnostica strutturate, è possibile esaminare i dati di origine originali che il database non è riuscito ad inserire. L'output delle righe rifiutate contiene copie dei record di origine, mantenuti esattamente come apparivano nei file di input. La diagnostica delle righe rifiutate genera file che contengono solo i record che hanno avuto esito negativo nell'inserimento:

  • Se si inseriscono file CSV usando COPY INTO (FILE_TYPE = 'CSV'), l'output rifiutato include un row.csv file. Questo file corrisponde alla struttura del file di origine e contiene le righe CSV originali con valori non validi.
  • Se si inseriscono file JSONL usando OPENROWSET(FORMAT = 'JSONL'), l'output rifiutato include un row.jsonl file. Questo file mantiene gli oggetti JSON originali che hanno causato errori di inserimento.

Usare questi file per convalidare la causa radice degli errori, ad esempio valori in formato non valido, valori imprevisti NULL o righe di intestazione che sono state analizzate erroneamente come dati.

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

Lo row.csv schema corrisponde alla forma CSV di origine e contiene solo le righe che hanno avuto esito negativo nell'inserimento.

Esempio di output di riga rifiutata:

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

In base a queste informazioni di diagnostica, è possibile identificare i problemi di inserimento seguenti:

  • La riga di intestazione nel file di origine viene erroneamente analizzata come riga di dati. Per risolvere il problema, l'istruzione COPY INTO deve usare l'opzione FIRSTROW = 2 .
  • Una riga nel file di origine per la vendorID colonna (C1) contiene NULL valori, ma la colonna corrispondente nella tabella di destinazione TaxiTrips è definita come NOT NULL.
  • Una riga nel file di origine per la passengerCount colonna contiene un valore non valido (N/A) che non può essere convertito nella colonna int di destinazione.

Note

Lo stesso processo si applica quando si esaminano le righe rifiutate dall'input JSONL. Usare il row.jsonl file per esaminare i record rifiutati.

Risolvere problemi di ingestione e reingestire i dati

Dopo aver identificato la causa degli errori di inserimento, risolvere il problema e re-ingestire i dati interessati. L'approccio di correzione dipende dalla posizione in cui ha origine l'errore.

Correggere lo schema della tabella di destinazione

Se i dati di origine non sono conformi allo schema della tabella di destinazione, aggiornare la definizione della tabella. Le correzioni comuni includono la modifica dei tipi di dati delle colonne o la rimozione di vincoli restrittivi, NOT NULLad esempio .

In alcuni scenari potrebbe essere necessario eliminare e ricreare la tabella di destinazione prima di reinsezionare i dati.

Correggere i dati di origine e reinsezionare i file

Se l'inserimento non riesce a causa di valori non validi o incoerenti nei file di origine, correggere tali valori e reinserire i dati. Ad esempio, sostituire i valori segnaposto, ad N/A esempio con valori vuoti o valori predefiniti validi.

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

Quando si rigestisci i dati corretti, usare un percorso di file esplicito che punta al nuovo file contenente solo dati corretti, anziché un percorso di cartella che fa riferimento ai file originali. Questo approccio impedisce la reinsezione di righe caricate in precedenza correttamente ed evita i dati duplicati.

Rielaborare le righe rifiutate usando una tabella di staging

È possibile caricare le righe rifiutate in una tabella di staging, correggere i dati usando Transact-SQL istruzioni di modifica dei dati e quindi reinsezionare le righe corrette.

L'istruzione seguente CREATE TABLE AS SELECT carica le righe rifiutate in una tabella per un'ulteriore elaborazione:

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

Dopo aver corretto i dati, inserire le righe pulite nella tabella di destinazione.