Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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.
Nell'area di lavoro del tuo magazzino, apri il magazzino.
Nella scheda Home selezionare Nuova query SQL.
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.
-
MAXERRORSimposta il numero massimo di errori a livello di riga tollerati durante l'inserimento. -
ERRORFILEspecifica 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.jsonlper la diagnostica strutturata -
row.csvper 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 unrow.csvfile. 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 unrow.jsonlfile. 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 INTOdeve usare l'opzioneFIRSTROW = 2. - Una riga nel file di origine per la
vendorIDcolonna (C1) contieneNULLvalori, ma la colonna corrispondente nella tabella di destinazioneTaxiTripsè definita comeNOT NULL. - Una riga nel file di origine per la
passengerCountcolonna 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.